以下是示例:
$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
答案 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
中。