我正在尝试打印出我阵列的大小。我已经在堆栈上跟随了一些其他问题,但是我从来没有得到我想要的结果。
在这个例子中,我想要的是打印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
我做错了什么,以及如何在声明时获得数组的总大小&这样填充?
答案 0 :(得分:16)
首先关闭:
my @arr;
$arr{1} = 1;
$arr{2} = 2;
$arr{3} = 3;
是胡说八道。 {}
用于散列键,因此您指的是%arr
而不是@arr
。 use 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;