2012-06-05 3 views
0

Игнорируя тот факт, что этого, вероятно, не произошло бы, если бы кто-то пользовался строгими и предупреждал, я хотел бы знать, почему эти два случая отличаются.Perl hashref/confusion

#!/usr/local/perl5/bin/perl 

$x[0] = ""; 
$y[0] = ""; 

$x[0]->{name} = "SRV"; 
$y[0]->{name} = "FINAL"; 
print "$x[0]->{name}, $y[0]->{name}\n"; 

$x[1]->{name} = "SRV"; 
$y[1]->{name} = "FINAL"; 
print "$x[1]->{name}, $y[1]->{name}\n"; 

Выход:

FINAL, FINAL 
SRV, FINAL 

Почему, когда индекс равен нулю, делает у [0] -> {имя} назначение влияют х [0] -> {имя}, но не когда индекс один?

Thanks,

Шон.

+6

Он не делает этого для меня. – gpojd

+0

Аналогично: @Sean: можете ли вы снова проверить и продемонстрировать, что это ведет себя так, как вы себя видите. В unix вы можете использовать: 'cat test.pl && perl test.pl' – Dancrumb

+0

Вы правы. Я удалил в своем коде два начальных задания, которые, как мне показалось, не были необходимы, чтобы показать проблему. Теперь это именно тот код, который я запускаю. Perl -v сообщает, что это версия v5.8.4. – Sean

ответ

5

Это не тот код, на котором вы на самом деле бежали. В коде, который вы представили, $x[0] и $y[0] являются ссылками на разные хеши, но в проблемном коде $x[0] и $y[0] являются ссылками на один и тот же хэш. Как показано в следующем коде:

my %hash = { name => "SRV" }; 
$x[0] = \%hash;   # $x[0] is a reference to %hash. 
$y[0] = $x[0];   # $y[0] is a reference to %hash. 
$y[0]->{name} = "FINAL"; # Changes $hash{name}. 

print $x[0]->{name};  # Prints $hash{name}. 
print $y[0]->{name};  # Prints $hash{name}. 

Указанная проблема может быть исправлена ​​путем изменения

$y[0] = $x[0]; 

в

$y[0] = { %{ $x[0] } }; 

или

use Storable qw(dclone); 
$y[0] = dclone($x[0]); 
+0

Хорошо, поэтому в отредактированной версии кода я присвоил значения $ x [0] и $ y [0] нулевым (ну, действительно, ""). Итак, вы говорите, что, поскольку оба они были присвоены null, они были ссылкой на один и тот же хеш, поэтому они были по существу той же переменной. Однако $ x [1] и $ y [1], поскольку они не были привязаны ни к чему, не были ссылками на одну и ту же переменную. (Я не пытаюсь заставить их быть одинаковыми. Это произошло потому, что один из них менял другой и вызывал проблему в скрипте.) – Sean

+1

@Sean, Always 'use strict; используйте предупреждения: «Вы сообщаете Perl о доступе к хешу, чье имя является пустой строкой. В примерах '[1]' они действительно равны null undef, поэтому Perl создает хэш для вас, когда вам это нужно в разборах. (Это называется автовивизацией.) – ikegami

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