2016-01-20 186 views
1

我有这个代码,我想将10,11和12添加到数组arr中。在Perl中向数组添加元素

my @num=(0,1,2); 
my $i=10; 
for my $d (@num){ 
    if (defined($d)) { 
     my @arr; 
     $arr[$d] = $i; 
     $i=$i+1; 
     my $dvv=dump(\@arr); 
     print "**** $dvv \n"; 
    } 
} 

的输出是:

**** [10] 
**** [undef, 11] 
**** [undef, undef, 12] 

为什么仅被定义阵列的最后一个元素?

+0

这是一件好事,保持'使用严格和使用warnings' – Shantesh

回答

6

由于您已经在循环内声明了数组,因此每次都会重新创建它,删除以前迭代循环中的任何值。

循环之前,您应该declaure @arr,如果您想要的值保持:

my @arr; 
for my $d (@num) { 
    ... 
} 

而且因为这行:

$arr[$d]; 

$d是由其他数组定义的位置(0 ,然后是1,然后是2)。因此它将$i的值放在该阵列中的该位置,并将之前的值放入undef

8

AntonH的answer解决了您的特定代码的具体问题,但实际上有重写代码的方法可以完全避免此问题。更“Perl化”的方式来完成同样的事情将是:

my @arr; 

for my $i (0 .. 2) { 
    push(@arr, $i + 10); 
} 

或者:

my @arr = map { $_ + 10 } 0 .. 2; 

或者只是:

my @arr = 10 .. 12;