在Perl中查找数组的大小
我似乎遇到了几种不同的方法来确定数组的大小。这三种方法的区别是什么在Perl中查找数组的大小,perl,Perl,我似乎遇到了几种不同的方法来确定数组的大小。这三种方法的区别是什么 my @arr = (2); print scalar @arr; # First way to print array size print $#arr; # Second way to print array size my $arrSize = @arr; print $arrSize; # Third way to print array size 第一种和第三种方法是相同的:它们在标量上下文中计算数组。我认为这是
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
第一种和第三种方法是相同的:它们在标量上下文中计算数组。我认为这是获得数组大小的标准方法。
第二种方法实际上返回数组的最后一个索引,该索引(通常)与数组大小不同。这是通过将数组强制放入标量上下文中来获取大小的,在标量上下文中,数组作为其大小进行计算:
print scalar @arr;
这是将数组强制放入标量上下文的另一种方法,因为它被分配给标量变量:
my $arrSize = @arr;
这将获取数组中最后一个元素的索引,因此它实际上是大小减1(假设索引从0开始,这在Perl中是可调整的,尽管这样做通常不是个好主意):
最后一个不太适合用于获取数组大小。如果您只想获取数组的最后一个元素,那么它将非常有用:
my $lastElement = $arr[$#arr];
if (@animals < 5) { ... }
此外,正如您在StackOverflow上看到的,大多数语法高亮显示程序都没有正确处理此构造…首先,第二个与其他两个不同
$#array
返回数组的最后一个索引,该索引比数组的大小小一个
另外两个几乎是一样的。您只是使用两种不同的方法来创建标量上下文。这归结为可读性问题
我个人比较喜欢以下几点:
say 0+@array; # Represent @array as a number
我发现它比我想象的更清楚
say scalar(@array); # Represent @array as a scalar
及
后者看起来很清晰,但我发现当它成为其他代码的一部分时,额外的一行会降低清晰度。它有助于教授@array
在标量上下文中的功能,如果您想不止一次地使用$size
,它可能会很有用。示例:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a; # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";
要使用第二种方法,请添加1:
print $#arr + 1; # Second way to print array size
如果我们稍微修改第二个,这三个结果都相同:
my @arr = (2, 4, 8, 10);
print "First result:\n";
print scalar @arr;
print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.
print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;
所包含的
特殊变量$#array
告诉您数组最后一个元素的索引:
print $mixed[$#mixed]; # last element, prints 1.23
您可能会尝试使用$#array+1
来告诉您一个数组中有多少项。不用麻烦了。碰巧,在Perl希望找到标量值的地方(“在标量上下文中”)使用@array
,将得到数组中的元素数:
my $lastElement = $arr[$#arr];
if (@animals < 5) { ... }
一些程序员选择使用显式转换,以便不留下任何疑问:
$element_count = scalar(@whatever);
在同一节的前面部分中,将介绍如何获取数组最后一个元素的索引
数组的长度是一个标量值。通过计算$#天
,您可以找到数组@days
的长度,如csh
。但是,这不是数组的长度;它是最后一个元素的下标,这是一个不同的值,因为通常有第0个元素
要查找数组的大小,请使用
scalar
关键字:
print scalar @array;
要查找数组的最后一个索引,有$#
(Perl默认变量)。它给出数组的最后一个索引。当数组从0开始时,我们通过将1添加到$#
来获得数组的大小:
例如:
my @a = (undef, undef);
my $size = @a;
warn "Size: " . $#a; # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";
输出:
3
3
从perldoc处,应安全地引用:
以下情况始终正确:
scalar(@whatever) == $#whatever + 1;
scalar(@whatever) == $#whatever + 1;
只要你不$#whatever++并且神秘地增加数组的大小
数组索引以0开头
及
通过为数组分配null list(),可以将数组截断为零。以下是等效的:
@whatever = ();
$#whatever = -1;
这就引出了我要寻找的是如何检测数组是否为空。如果$#empty==-1 打印数组大小的方法有多种。以下是所有的含义: 假设我们的数组是
my@arr=(3,4)代码>
方法1:标量
这是获取数组大小的正确方法
print scalar @arr; # Prints size, here 2
方法2:索引编号
$#arr
给出数组的最后一个索引。所以如果数组的大小是10,那么它的最后一个索引将是9
print $#arr; # Prints 1, as last index is 1
print $#arr + 1; # Adds 1 to the last index to get the array size
我们在这里添加1,将数组视为0-indexed。但是,如果它不是基于零的,这个逻辑将失败
perl -le 'local $[ = 4; my @arr = (3, 4); print $#arr + 1;' # prints 6
上面的示例打印6,因为我们已将其初始索引设置为4。现在索引将是5和6,分别包含元素3和4
方法3:
当在标量上下文中使用数组时,它返回数组的大小
my $size = @arr;
print $size; # Prints size, here 2
实际上,方法3和方法1是相同的。使用int(@array)
,因为它威胁到参数是标量。正如许多答案所指出的,第一种和第三种方法是获得数组大小的正确方法,而第二种方法不是
在这里,我用一些用法示例来扩展这些答案
@array\u name
在标量上下文中使用时,计算结果为数组长度=数组大小=数组中的元素数
perl -le 'local $[ = 4; my @arr = (3, 4); print $#arr + 1;' # prints 6
下面是一些标量上下文的示例,例如@array\u name
本身在if
或中,除非,否则在算术比较中,例如==
或=代码>
如果您将@array\u name
更改为标量(@array\u name)
,所有这些示例都可以使用。这将使代码更明确,但也更长,可读性稍差。因此,这里更倾向于省略scalar()
my @a = (undef, q{}, 0, 1);
# All of these test whether 'array' has four elements:
print q{array has four elements} if @a == 4;
print q{array has four elements} unless @a != 4;
@a == 4 and print q{array has four elements};
!(@a != 4) and print q{array has four elements};
# All of the above print:
# array has four elements
# All of these test whether array is not empty:
print q{array is not empty} if @a;
print q{array is not empty} unless !@a;
@a and print q{array is not empty};
!(!@a) and print q{array is not empty};
# All of the above print:
# array is not empty
(1,2,3)的大小为3,索引(默认情况下)为0、1和2。因此,在本例中,$#arr将是2,而不是3。预定义变量$[
指定“数组中第一个元素的索引,以及子字符串中第一个字符的索引”(perldoc perlvar
)。默认情况下,它设置为0,不建议将其设置为0以外的任何值。@Keith Thompson,$[/code>(已经十年了)。$[
已被弃用。使用$[
即使不打开警告也会发出弃用警告。Assi