jer*_*ygo 25 arrays perl initialization
如何将数组初始化为0?
我试过这个.
my @arr = ();
Run Code Online (Sandbox Code Playgroud)
但它总是给我一个警告,"使用未初始化的价值".我事先不知道阵列的大小.我动态填写它.我认为上面的代码应该初始化为0.
我该怎么做呢?
FMc*_*FMc 52
如果我了解你,也许你不需要一个零数组; 相反,你需要一个哈希.哈希键将是另一个数组中的值,哈希值将是该值存在于另一个数组中的次数:
use strict;
use warnings;
my @other_array = (0,0,0,1,2,2,3,3,3,4);
my %tallies;
$tallies{$_} ++ for @other_array;
print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;
Run Code Online (Sandbox Code Playgroud)
输出:
0 => 3
1 => 1
2 => 2
3 => 3
4 => 1
Run Code Online (Sandbox Code Playgroud)
要更直接地回答您的特定问题,要创建一个填充了一堆零的数组,您可以在以下两个示例中使用该技术:
my @zeroes = (0) x 5; # (0,0,0,0,0)
my @zeroes = (0) x @other_array; # A zero for each item in @other_array.
# This works because in scalar context
# an array evaluates to its size.
Run Code Online (Sandbox Code Playgroud)
Eth*_*her 18
"将数组初始化为零"是什么意思?数组不包含"零" - 它们可以包含"零元素",这与"空列表"相同.或者,您可以拥有一个包含一个元素的数组,其中该元素为零:my @array = (0);
my @array = ();应该工作得很好 - 它分配一个名为的新数组@array,然后将其分配给空列表().请注意,这与简单地说是相同的my @array;,因为新数组的初始值无论如何都是空列表.
您确定从这一行收到错误,而不是代码中的其他地方吗?确保您有use strict; use warnings;模块或脚本,并检查您获得的错误的行号.(在这里发布一些上下文代码也可能有所帮助.)
要在您的帖子评论中生成输出,请执行以下操作:
use strict;
use warnings;
my @other_array = (0,0,0,1,2,2,3,3,3,4);
my @array;
my %uniqs;
$uniqs{$_}++ for @other_array;
foreach (keys %uniqs) { $array[$_]=$uniqs{$_} }
print "array[$_] = $array[$_]\n" for (0..$#array);
Run Code Online (Sandbox Code Playgroud)
输出:
array[0] = 3
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 1
Run Code Online (Sandbox Code Playgroud)
这与您所说的生成具有零值的并行数组的算法不同,但这是一种更Perly的方法......
如果您必须有一个与第一个数组大小相同且元素初始化为 0 的并行数组,则此语句将动态执行此操作:@array=(0) x scalar(@other_array);但实际上,您不需要这样做。