1

下面的代码用于显示在命令行中输入的参数数量。

#!/usr/bin/perl –w
$myVar = $#ARGV + 1;
print "Hi " , $ARGV[0] , "\n";
print "You have $myVar arguments\n";

在 perlintro 中,$#ARGV是一个特殊变量,它告诉您数组最后一个元素的索引。

如果是这种情况,当我没有在命令行中输入任何值时,$myVarvalue 如何以 0 结尾?

是不是因为当数组中没有元素时,“无元素”的索引是 -1 ?因为-1 + 1 = 0。

4

4 回答 4

5

$#ARGV意思是“ARGV 的最后一个元素的索引”——不仅仅是 perlintro 句子似乎暗示的任何数组。

对于任何数组,如果它为空,则为$#array-1 和scalar @array0。

警告:如果有人修改$[了(“第一个元素的索引”),那也会改变$#。如果您追求长度并获取最后一个元素,您可能应该始终使用。scalar @array$array[-1]

> cat demo.pl
my @array = ();
print "Size=", scalar @array, " items, last=", $#array, "\n";
$[ = 2;
print "Size=", scalar @array, " items, last=", $#array, "\n";
> perl demo.pl
Size=0 items, last=-1
Size=0 items, last=1
于 2013-04-18T07:47:25.720 回答
2

你说的对。

$#ARGVscalar @ARGV - 1,正如 squiguy 指出的那样。

但是有一些噪音较小的替代方法可以计算传递给程序的参数数量,您应该考虑使用这些替代方法:

my $count = scalar @ARGV;  # Explicit using of 'scalar' function
my $count = 0+@ARGV;       # Implicitly enforce scalar context
my $count = @ARGV;         # Since the context is already set by LHS
于 2013-04-18T07:48:50.927 回答
2

根据perlvar页面:

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

于 2013-04-18T07:37:42.167 回答
0

是不是因为当数组中没有元素时,“无元素”的索引是 -1 ?因为 -1 + 1 = 0

几乎。它不是“'无元素'的索引”,而是适用以下规则:

perldata

以下情况总是正确的:

标量(@whatever)== $#whatever + 1;

于 2013-04-18T07:49:08.490 回答