Perl中的数组初始化
如何将数组初始化为0 我试过这个Perl中的数组初始化,perl,arrays,initialization,Perl,Arrays,Initialization,如何将数组初始化为0 我试过这个 my @arr = (); 但它总是给我一个警告,“使用未初始化值”。我事先不知道阵列的大小。我动态填充它。我认为上面的代码应该将其初始化为0 怎么做?你说的“将数组初始化为零”是什么意思?数组不包含“零”——它们可以包含“零元素”,这与“空列表”相同。或者,您可以有一个包含一个元素的数组,其中该元素为零:my@array=(0) my@array=()应该可以正常工作——它分配一个名为@array的新数组,然后为它分配一个空列表,()。请注意,这与简单地说m
my @arr = ();
但它总是给我一个警告,“使用未初始化值”。我事先不知道阵列的大小。我动态填充它。我认为上面的代码应该将其初始化为0
怎么做?你说的“将数组初始化为零”是什么意思?数组不包含“零”——它们可以包含“零元素”,这与“空列表”相同。或者,您可以有一个包含一个元素的数组,其中该元素为零:my@array=(0)代码>
my@array=()
应该可以正常工作——它分配一个名为@array
的新数组,然后为它分配一个空列表,()
。请注意,这与简单地说my@array相同代码>,因为新数组的初始值无论如何都是空列表
您确定这行代码中有错误,而不是其他代码中的错误吗?确保使用严格;使用警告在模块或脚本中编写>代码,并检查得到的错误行号。(在这里发布一些上下文代码也可能有帮助。)如果我理解你的意思,也许你不需要一个零数组;相反,您需要一个散列。哈希键将是另一个数组中的值,哈希值将是该值在另一个数组中存在的次数:
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;
为了更直接地回答您的特定问题,要创建一个填充了一组零的数组,您可以在以下两个示例中使用该技术:
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.
要在您的帖子评论中生成输出,可以这样做:
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);
输出:
0 => 3
1 => 1
2 => 2
3 => 3
4 => 1
array[0] = 3
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 1
这与您所述的生成具有零值的并行数组的算法不同,但这是一种更可靠的方法
如果必须有一个与第一个数组大小相同且元素初始化为0的并行数组,则此语句将动态执行此操作:@array=(0)x scalar(@other_array)代码>但实际上,您不需要这样做。向我们展示您遇到问题的代码。为什么需要将其设置为0?与此类似。我有另一个数组,上面有[0,0,0,1,2,2,3,3,3,4]这样的数字,现在我必须计算0,1,2,3,4的数字,所以我将使用另一个数组…并将计数存储在给定的索引中。所以我将有arr[0]=3arr[1]=1arr[2]=2arr[3]=3arr[4]=4,当我遇到一个元素时,我会。。。arr[i]=arr[i]+1;为此,我需要从使用0初始化的元素开始。上述代码有效。但是它也抛出了一个警告,你可以使用$arr[i]++代替$arr[i]=$arr[i]+1;另外,如果数组为空,$arr[i]++仍将$arr[i]设置为1@MkV$arr[i]+=1
在某些情况下可能会更好,++
在Perl中有一些魔力,使它变得更慢。@Ven'Tatsu:你有没有理由(减速)呢?我知道当它是未定义(预转换为0)或字符串时会有魔力。在进行基准测试时,我没有发现速度有显著差异(>1微秒)。对不起。对我想将数组的元素初始化为0。这样我就可以使用数组作为每个索引的某种计数器。请参考上述注释了解确切的问题。如果要初始化一个数组,使其具有与另一个数组相同的元素数,请使用所有特定值;做一些类似的事情;my@arr2=(0)x@arr1@MkV:ormy@arr2=(0)x$#arr1
也一样,否?@jerrygo:不需要显式地将数组初始化为全零;如果从空数组中执行$array[$i]+
,事情将“正常工作”。@drewk:no,$\arr1
与标量(@arr1)
不同。对于包含五个元素的数组,前者是4,后者是5(假设您没有将默认值更改为$[
)。谢谢。这太神奇了。但我仍然想知道,为什么我不能将数组元素初始化为0。而不使用哈希。问题是它只起作用,但在访问未初始化的值之前会给我一个警告。@jerrygo:你是否使用了旧版本的perl?上面的代码不应该给你任何警告。@Ether:奇怪。我使用的是strawberry perl版本5.16,我仍然收到警告消息。为了避免这种情况,我插入了一个条件:if(def$value){push(@array,$value)}else{push(@array,“”)}
。