@ARGV Perl命令行参数

时间:2022-06-25 14:32:23

$#作为一个变量表示打印数字时默认的数字输出格式,后面加上ARGV又表示什么意思呢?

遇到perl的问题首先查perldoc,在perlvar里查到关于@ARGV的一条:
      The array @ARGV contains the command-line arguments intended for the script. $#ARGV is generally the number of arguments minus one, because $ARGV[0] is the first argument, not the program's command name itself. See $0 for the command name.
可以看出,$#ARGV为命令行参数(不包括命令本身)的个数减一,即数组@ARGV最后一个元素的索引。用处也就是在程序开始时判断命令行参数个数,或者直接操作最后一个命令行参数。

本质上,$#加数组名表示数组最后一个元素的索引,其实,这种糟糕的语法来源于C Shell,在实际的代码中不常见。判断命令行参数个数,可以把@ARGV用在标量上下文中,直接操作最后一个数组元素,可以利用负数索引值。(参见《perl语言入门》3.2 特殊的数组索引)

 

 

当perl脚本运行时,从命令行上传递给它的参数存储在内建数组@ARGV中,@ARGV是PERL默认用来接收参数的数组,可以有多个参数,$ARGV[0]是表示接收到的第一个参数,$ARGV[1]表示第二个。使用方法为: perl my.pl $ARGV[0] $ARGV[1] 看一个具体例子:比如文件1的内容: 1320238 1320239 1320239 1320238 1320238 1320238 1320235 1320237 文件2的内容: 102 5709072117805887 4001 1301854 102 5709072117807510 4001 1320292 102 5709072117838653 4001 1301857 102 5709072117814280 4001 1305832 102 5709072117839397 4001 1310673 102 5709072117839335 4001 1311270 我想先把文件1的内容读取出来,然后读取文件二的内容,在读取文件2的内容的时候,文件2的最后一列需要包含在上文件1内。 [root@localhost ~]$ perl ex.pl 1.txt 2.txt [root@localhost ~]$ cat ex.pl #!/usr/bin/perl use strict; open(ONE,"$ARGV[0]") or die $!; open(TWO,"$ARGV[1]") or die $!; my %hash; while () { chomp; my @line=split; my $column4=$line[3]; $hash{$column4}=$_; } while () { chomp; print $hash{$_} if defined $hash{$_}; } print"/n";