it-swarm.cn

在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
232
David

第一种和第三种方式是相同的:它们在标量上下文中评估数组。我认为这是获得数组大小的标准方法。

第二种方式实际上返回数组的最后一个索引,它不(通常)与数组大小相同。

223
Chris Jester-Young

首先,第二个不等于其他两个。 $#array返回数组的最后一个索引,该索引比数组的大小小一个。

其他两个实际上是相同的。您只是使用两种不同的方法来创建标量上下文。它归结为可读性问题。

我个人更喜欢以下内容:

say [email protected];          # Represent @array as a number

我发现它比清楚的更清楚

say scalar(@array);    # Represent @array as a scalar

my $size = @array;
say $size;

后者看起来非常清楚这样,但我发现额外的线条在其他代码的一部分时会明显失去清晰度。它有助于教导@array在标量上下文中的作用,也许如果你想多次使用$size

37
ikegami

这通过将数组强制转换为标量上下文来获得大小,在该上下文中将其计算为其大小:

print scalar @arr;

这是将数组强制转换为标量上下文的另一种方法,因为它被分配给标量变量:

my $arrSize = @arr;

这得到了数组中最后一个元素的索引,所以实际上它的大小减去1(假设索引从0开始,可以在Perl中调整,尽管这样做通常是个坏主意):

print $#arr;

最后一个用于获取数组大小并不是很好。如果您只想获取数组的最后一个元素,那将非常有用:

my $lastElement = $arr[$#arr];

此外,正如您在Stack Overflow上看到的那样,大多数语法高亮显示器都无法正确处理此构造...

27
Nate C-K

要使用第二种方式,请添加1:

print $#arr + 1; # Second way to print array size
6
jhoanna

如果我们稍微修改第二个,则所有三个都给出相同的结果:

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;
5
Zon

例:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
5
dimas

有多种方法可以打印数组大小。以下是所有的含义:假设我们的数组是my @arr = (3,4);

方法1:标量

这是获得数组大小的正确方法。

print scalar @arr;  # prints size, here 2

方法2:索引号

$#arr给出了数组的最后一个索引。所以如果array的大小为10,那么它的最后一个索引将是9。

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get 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是相同的。

2
Kamal Nayan

perlintro文档“Perl变量类型”部分 包含

特殊变量$#array告诉你数组的最后一个元素的索引:

print $mixed[$#mixed];       # last element, prints 1.23

您可能想使用$#array + 1来告诉您数组中有多少项。不要打扰。碰巧使用@array,其中Perl期望找到一个标量值(“在标量上下文中”)将给出数组中元素的数量:

if (@animals < 5) { ... }

perldata文档 也在 “标量值”部分 中介绍了这一点。

如果在标量上下文中计算数组,则返回数组的长度。 (请注意,列表不是这样,它返回最后一个值,如C逗号运算符,也不返回内置函数,返回它们返回的任何内容。)以下内容始终为真:

scalar(@whatever) == $#whatever + 1;

一些程序员选择使用显式转换,以免产生任何疑问:

$element_count = scalar(@whatever);

在同一节的前面部分介绍了如何获取数组最后一个元素的索引。

数组的长度是标量值。您可以通过评估@days找到数组$#days的长度,如csh。但是,这不是阵列的长度;它是最后一个元素的下标,它是一个不同的值,因为通常有第0个元素。

2
Greg Bacon

来自perldoc perldata ,这应该是安全的引用:

以下是永远的:

scalar(@whatever) == $#whatever + 1;

只要你没有$#whatever ++并神秘地增加大小或你的阵列。

数组索引从0开始。

您可以通过为其分配空列表()来将数组截断为空。以下是等效的:

    @whatever = ();
    $#whatever = -1;

这让我想到了我正在寻找的是如何检测数组是空的。如果$#empty == -1,我发现了它;

2
jwal

怎么样int(@array)因为它威胁参数作为标量。

1
Reflective

要查找数组的大小,请使用scalar关键字:

print scalar @array;

要找出数组的最后一个索引,有$#(Perl默认变量)。它给出了数组的最后一个索引。当数组从0开始时,我们通过向$#添加一个来获得数组的大小:

print "$#array+1";

例:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

输出:

3

3
0
Sandeep_black