“print $ ARGV”会以任何方式改变参数数组吗?

时间:2013-12-17 00:30:19

标签: perl command-line-arguments argv shift

以下是示例:

$a = shift; 
$b = shift; 
push(@ARGV,$b); 
$c = <>; 

print "\$b: $b\n"; 
print "\$c: $c\n"; 
print "\$ARGV: $ARGV\n"; 
print "\@ARGV: @ARGV\n"; 

输出:

$b: file1 
$c: dir3 

$ARGV: file2 
@ARGV: file3 file1 

我不明白在没有任何索引的情况下打印$ ARGV时究竟发生了什么。它是否打印第一个参数然后从数组中删除它?因为我认为在所有语句之后数组变成了:

file2 file3 file1

调用:

perl port.pl -axt file1 file2 file3 

file1包含以下行:

dir1 
dir2 

file2:

dir3 
dir4 
dir5 

file3:

dir6 
dir7

3 个答案:

答案 0 :(得分:7)

Greg引用了相应的文档,所以这里有一个快速概述发生的事情

$a = shift;                 # "-axt" is removed from @ARGV and assigned to $a
$b = shift;                 # "file1" likewise
push(@ARGV,$b);             # "file1" inserted at end of @ARGV
$c = <>;                    # "file2" is removed from @ARGV, and its file
                            # handle opened, the first line of file2 is read

当打开“file2”的文件句柄时,它会在$ARGV中设置文件名。正如Greg所说,@ARGV$ARGV是完全不同的变量。

钻石运营商<>的内部运作可能会令您感到困惑,因为它具有近似$ARGV = shift @ARGV

答案 1 :(得分:5)

在Perl中,$ARGV@ARGV完全不同。来自perlvar

  

$ ARGV

     

<>读取时包含当前文件的名称。

     

@ARGV

     

数组@ARGV包含用于脚本的命令行参数。 $#ARGV通常是参数的数量减去1,因为$ARGV[0]是第一个参数,而不是程序的命令名本身。有关命令名称,请参阅$0

答案 2 :(得分:4)

不,但<>确实如此。 <><ARGV>的缩写({1}}的缩写readline(ARGV) ,其中ARGV是一个特殊的文件句柄,可以从@ARGV中列出的文件中读取(如果STDIN为空,则为@ARGV)。当它打开@ARGV中的文件时,会将其从@ARGV中删除,并将其存储在$ARGV中。