计算perl数组大小

时间:2016-01-12 14:28:07

标签: arrays perl

我正在尝试打印出我阵列的大小。我已经在堆栈上跟随了一些其他问题,但是我从来没有得到我想要的结果。

在这个例子中,我想要的是打印3的值,因为我有3个索引。我得到的,从两种打印方法都是0。

my @arr;

$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;

my $size = @arr;

print $size; # prints 0

print scalar @arr; # prints 0

我做错了什么,以及如何在声明时获得数组的总大小&这样填充?

4 个答案:

答案 0 :(得分:16)

首先关闭:

my @arr;

$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;

是胡说八道。 {}用于散列键,因此您指的是%arr而不是@arruse strict;use warnings;会告诉你这个,并且只是为什么它们被认为是强制性的一小部分。

要计算数组中的元素,只需在标量上下文中访问它。

print scalar @arr; 

if ( $num_elements < @arr ) { do_something(); }

但你需要改变你的东西

 my @arr;

$arr[1] = 1;
$arr[2] = 2;
$arr[3] = 3;

请注意 - 数组$arr[0]的第一个元素将是未定义的。

$VAR1 = [
          undef,
          1,
          2,
          3
        ];

因此,您将得到4的结果。要获得所需的“元素数”,您需要过滤未定义的项目,例如grep

print scalar grep {defined} @arr;

这将@arr过滤grep(返回3个元素),然后取标量值 - 元素数,在本例中为3.

但通常情况下 - 你不会这样做。这是唯一必要的,因为您试图将值插入到数组中的特定“槽”中。

您更常做的事情是使用直接分配:

my @arr = ( 1, 2, 3 );

或者:

push ( @arr, 1 );
push ( @arr, 2 ); 
push ( @arr, 3 ); 

将值插入数组的末尾。你会 - 如果明确地迭代 - 从0..$#arr开始,但你很少需要这样做:

foreach my $element ( @arr ) { 
   print $element,"\n"; 
}

或者您可以使用哈希:

my %arr;

$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;

这会将您的数组转换为一组(无序)键值对,您可以使用keys %arr访问它们并完全相同:

print scalar keys %arr;
if ( $elements < keys %arr ) { do_something(); } 

在后一种情况下,您的哈希将是:

$VAR1 = {
          '1' => 1,
          '3' => 3,
          '2' => 2
        };

我建议这是不好的做法 - 如果你有订购的价值,那么工作的工具就是数组。如果您有'key'值,则哈希可能仍然是作业的工具 - 例如'请求ID'或类似名称。您通常可以通过查看访问数据的方式以及是否存在任何间隙(包括从零开始)来区分差异。

所以回答你提出的问题:

my $size = @arr;
print $size; # prints 0
print scalar @arr; # prints 0

这些不起作用,因为你永远不会在@arr中插入任何值。但是你确实有一个隐式创建的名为%arr的哈希。 (再次 - use strict;use warnings;会告诉你这个)。

答案 1 :(得分:2)

您正在初始化哈希,而不是数组。

要获得哈希的“大小”,您可以写。

my $size = keys %arr;

答案 2 :(得分:0)

我认为应该有一个使用USUW(使用严格/使用警告)运行的代码的说明以及它为故障排除过程添加的内容:

use strict;
use warnings;

my @arr;
...

当你运行它时:

Global symbol "%arr" requires explicit package name (did you forget to declare "my %arr"?) at - line 9.
Global symbol "%arr" requires explicit package name (did you forget to declare "my %arr"?) at - line 10.
Global symbol "%arr" requires explicit package name (did you forget to declare "my %arr"?) at - line 11.
Execution of - aborted due to compilation errors.

所以USUW。

答案 3 :(得分:0)

当您输入以下代码时,您可能会认为正在实例化@arr的元素:

$arr{1} = 1;

但是,您正在实例化一个哈希。这告诉我你没有使用strict或者你会有错误。相反,更改为括号,如下所示:

$arr[1] = 1;