2012-02-06 2 views
3

Просто интересно, что я делаю что-то неправильно или если это ошибка perl ... Я хочу создать массив хеш-значений. Я использую «push», чтобы поместить значения в массив. Первая запись хэша в массив работает отлично, но когда я нажимаю второй хэш на массив, первый элемент массива, кажется, перезаписывается тем, что я только что нажал на массив. Почему это происходит? Смотрите код ниже:Почему толчок хэша на массив, кажется, переписывает все элементы массива?

use Data::Dumper; 

my %val; 

%val = (key1 => "Val1"); 

my @myArr; 

my $cnt = push(@myArr,\%val); 

print "After push (should contain 1 element): " . Dumper(@myArr) . "\n"; 

%val = (key2 => "Val2"); 

my $cnt = push(@myArr,\%val); 

print "After push 2: (should contain 2 different elements):" . Dumper(@myArr) . "\n"; 
print " You can see above that element 1 and 2 of the array equal each other when they should be different\n"; 

ответ

18

"perl bug" - да, шанс на жир. :-)

Вы нажимаете ссылку на хеш в свой массив, а затем меняете этот очень хэш, а затем снова нажимаете одну и ту же ссылку.

Вы, наверное, нужна копия или совершенно другой хеш:

другой переменной:

#!/usr/bin/perl 

use strict; # always use strict 
use warnings; 
use Data::Dumper; 

my (%val, %other_val, @myArr); 

%val  = (key1 => "Val1"); 
%other_val = (key2 => "Val2"); 

push(@myArr, \%val); 
push(@myArr, \%other_val); 

print Dumper(\@myArr) . "\n"; 

Копирование:

#!/usr/bin/perl 

use strict; # always use strict 
use warnings; 
use Data::Dumper; 

my (%val, %other_val, @myArr); 

%val = (key1 => "Val1"); 
push(@myArr, { %val }); 

%val = (key2 => "Val2"); 
push(@myArr, { %val }); 


print Dumper(\@myArr) . "\n"; 
+0

Просто Sidenote. Но ваше «копирование» работает только в том случае, если хеш - это простой ключ к строковым значениям. Если% val содержит также arrayrefs или hashrefs, вам нужна «глубокая копия». Лучше всего использовать для этого модуль типа «Клон». http://search.cpan.org/perldoc?Clone –

0

Это очень естественно: вы используете один и тот же контейнер %val дважды. Вы явно переопределяете его содержимое.

2

Обратите внимание, как вы нажимаете ссылку на hash% val? Ну, если вы измените этот хеш, ссылка, естественно, будет указывать на другое значение.

Смежные вопросы