在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