Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中的数组初始化_Perl_Arrays_Initialization - Fatal编程技术网

Perl中的数组初始化

Perl中的数组初始化,perl,arrays,initialization,Perl,Arrays,Initialization,如何将数组初始化为0 我试过这个 my @arr = (); 但它总是给我一个警告,“使用未初始化值”。我事先不知道阵列的大小。我动态填充它。我认为上面的代码应该将其初始化为0 怎么做?你说的“将数组初始化为零”是什么意思?数组不包含“零”——它们可以包含“零元素”,这与“空列表”相同。或者,您可以有一个包含一个元素的数组,其中该元素为零:my@array=(0) my@array=()应该可以正常工作——它分配一个名为@array的新数组,然后为它分配一个空列表,()。请注意,这与简单地说m

如何将数组初始化为0

我试过这个

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:or
my@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,“”)}