什么是Perl相当于shell的“$ @”?

时间:2009-09-09 04:36:58

标签: perl shell

我正在研究一个Perl脚本,我希望捕获在命令行输入的字符串,而不必输入引号(类似于bash的“$ @”能力)。我将使用这个命令,所以我希望这是可能的。如果我有:

if ($ARGV) {

我必须将命令行字符串放在引号中。我宁愿做这样的命令:

htmlencode some & HTML <> entities

没有引号。有没有办法在Perl中执行此操作?

2 个答案:

答案 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数组中,请不要将它们放回一个字符串中。将它们分开。