没有元素时的默认值$#ArrayName(Perl)

时间:2013-04-18 07:31:15

标签: perl

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

#!/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。

4 个答案:

答案 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)

你是对的。

$#ARGVscalar @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

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

perldata

  

以下情况始终如此:

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

相关问题