以下代码显示在命令行中输入的参数数量。
#!/usr/bin/perl –w
$myVar = $#ARGV + 1;
print "Hi " , $ARGV[0] , "\n";
print "You have $myVar arguments\n";
从perlintro,$#ARGV
是一个特殊变量,它告诉你数组的最后一个元素的索引。
如果是这种情况,当我在命令行中没有输入任何值时,$myVar
值如何以0结尾?
是因为当数组中没有元素时,“无元素”的索引是-1吗?为-1 + 1 = 0。
答案 0 :(得分:5)
$#ARGV
表示“ARGV的最后一个元素的索引” - 不仅仅是perlintro句子似乎暗示的任何数组。
对于任何数组,如果它为空,$#array
将为-1,scalar @array
将为0.
CAVEAT:如果有人修改了$[
(“第一个元素的索引”),那么也会改变$#
。如果您在长度之后,可能总是使用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
答案 1 :(得分:2)
根据perlvar页面:
@ARGV数组@ARGV包含用于的命令行参数 剧本。 $#ARGV通常是参数的数量减一, 因为$ ARGV [0]是第一个参数,而不是程序的命令名 本身。请参阅$ 0获取命令名称。
答案 2 :(得分:2)
你是对的。
$#ARGV
是scalar @ARGV - 1
,正如暧昧指出的那样。
但是,计算传递给你的程序的参数数量的方法要少一些,你应该考虑使用它们:
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
答案 3 :(得分:0)
是因为当数组中没有元素时,“无元素”的索引是-1吗?为-1 + 1 = 0
几乎。它不是“无元素的索引”,而是适用以下规则:
以下情况始终如此:
标量(@whatever)== $#whatever + 1;