我正在研究一个Perl脚本,我希望捕获在命令行输入的字符串,而不必输入引号(类似于bash的“$ @”能力)。我将使用这个命令,所以我希望这是可能的。如果我有:
if ($ARGV) {
我必须将命令行字符串放在引号中。我宁愿做这样的命令:
htmlencode some & HTML <> entities
没有引号。有没有办法在Perl中执行此操作?
答案 0 :(得分:4)
@ARGV
数组包含Perl脚本的参数 - 不需要引号。
那就是说,问题是:
我必须将命令行字符串放在引号中。我宁愿做这样的命令:
htmlencode some & HTML <> entities
没有引号。有没有办法在perl中执行此操作?
好吧,如果显示的命令是在shell命令行中编写的,则必须遵守shell约定 - 这意味着转义“&
”和“<>
”以防止shell解释它们。同样,在Perl脚本中,需要保护该序列不受Perl的影响。也许你会写:
system "htmlencode", "some", "&", "HTML", "<>", "entities";
也就是说,一切都必须在引号中 - 但这种表示法会避免执行shell并让shell解释命令。
或者,再次,如果您将参数放入数组(在加载数组时使用引号),那么您可以将该数组传递给system
而不使用任何引号:
my @args = ( "htmlencode", "some", "&", "HTML", "<>", "entities" );
system @args;
但我觉得这个问题很混乱。
答案 1 :(得分:3)
您在bash中放置$@
周围的引号,以便它扩展为引用数组中的每个元素。这样做的原因是,当将它们全部传递给下一个命令时,数组的每个元素将继续被视为单个参数。
与Perl中的模拟相似的是您希望将这些参数传递给另一个外部命令。如果你使用反引号运算符运行外部程序,那么你需要引用每个参数,但是如果你使用system
,那么Perl将负责为你保留所有参数。
实际上,单独的参数是程序在Unix上执行的方式。单字符串命令行格式存在,因为我们需要能够在命令提示符下键入内容。像所有shell一样,bash has special rules关于如何将单个字符串拆分成多个参数。但是如果你已经将它们分开在Perl数组中,请不要将它们放回一个字符串中。将它们分开。