Perl 系统调用必须同时发送单引号和双引号 ' "

A Perl system call must send exactly both characters single & double quote ' "

Perl 系统调用必须将以下字符串发送到 UnixShell:

'"XYZ"'

在我的 Perl 脚本中,我使用了以下命令:

system("cleartool mkattr -replace ATTRIBUTE '"$attribute"' lbtype:$label");

一切都很好地传递给 Shell Unix,除了引号字符的两种使用:

'

的确如此,

cleartool mkattr -replace ATTRIBUTE

上面的命令通过了,这正是我想要的。 Perl 变量 $attribute 和 $label 被很好地解释了。 但我不知道该怎么做才能得到:

'"XYZ"'

这里XYZ是Perl变量$attribute的值 OS 是 AIX (Unix)Shellksh。 cleartool 是 Clearcase 的命令行界面,但是 不需要 Clearcase 技能 来解决我的问题。

参见 "Quote and Quote like Operators" 并使用 qq{...}:

system(qq{cleartool mkattr -replace ATTRIBUTE '"$attribute"' lbtype:$label});

qq{...}"..." 完全相同,除了您可以在字符串中使用双引号 " 而无需转义 它们。

您可以在 qq 之后直接使用任何字符,然后必须使用相同的字符来表示字符串结尾,即 qqX...X 的工作方式相同。如果您的字符串包含 Xes,您会 运行 遇到问题,所以不要那样做。

您还可以使用 成对的 字符作为分隔符({}()<>),这是您通常会看到的。

如果你想执行系统命令并且不必使用任何像重定向这样的shell语法,通常使用system:[=15的列表形式更好更安全=]

system(
    'cleartool',  'mkattr', '-replace', 'ATTRIBUTE',
    qq{"$attribute"}, qq{lbtype:$label}
);
# or, if you really want to pass both types of quotes:
system(
    'cleartool',  'mkattr', '-replace', 'ATTRIBUTE',
    qq{'"$attribute"'}, qq{lbtype:$label}
);

perldoc -f system

从你的问题中不清楚你是想通过 '"XYZ"' 还是 "XYZ"