我似乎遇到了几种不同的方法来查找数组的大小。这三种方法有什么区别?

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

当前回答

正如许多答案所指出的那样,第一种和第三种方法是获取数组大小的正确方法,而第二种方法则不是。

在这里,我将用一些用法示例来扩展这些答案。

@array_name在标量上下文中使用时,计算结果为数组的长度=数组的大小=数组中的元素数量。

下面是标量上下文的一些示例,例如在if或unless中单独使用@array_name,用于==或!=这样的算术比较。

如果将@array_name更改为标量(@array_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

其他回答

这个函数通过强制数组进入一个标量上下文来获取数组的大小,在这个上下文中数组的值是数组的大小:

print scalar @arr;

这是另一种强制数组进入标量上下文的方式,因为它被赋值给一个标量变量:

my $arrSize = @arr;

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

print $#arr;

最后一个不太适合用于获取数组大小。如果你只想获取数组的最后一个元素,它会很有用:

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

此外,正如你在Stack Overflow上看到的,大多数语法高亮显示器都不能正确处理这个构造……

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

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

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

print scalar @array;

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

print "$#array+1";

例子:

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

输出:

3

3

例子:

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

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

正如许多答案所指出的那样,第一种和第三种方法是获取数组大小的正确方法,而第二种方法则不是。

在这里,我将用一些用法示例来扩展这些答案。

@array_name在标量上下文中使用时,计算结果为数组的长度=数组的大小=数组中的元素数量。

下面是标量上下文的一些示例,例如在if或unless中单独使用@array_name,用于==或!=这样的算术比较。

如果将@array_name更改为标量(@array_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