Эрик Стром прав, но давайте посмотрим, сможем ли мы объяснить это по-другому:
sub foo {
my($h1, $h2) = @_;
$h2 = $h1;
}
Давайте сделаем все проще: $h1
указывает на ячейку памяти # 1 и$h2
указывает на ячейку памяти # 2.Ваше утверждение $h2 = $h1
теперь заставляет $h2
указать и на ячейку памяти # 1.
Изменилось ли содержимое ячейки памяти № 1?Нет. Изменилось ли содержимое ячейки памяти № 2?
Как только вы покидаете подпрограмму, $h1
и $h2
больше не существуют.
sub bar {
my($h1, $h2) = @_;
%{$h2} = %{$h1};
}
Когда вы говорите %{$h1}
, вы сейчас говорите о содержимомячейка памяти № 1.В вашем задании вы копируете содержимое ячейки памяти № 1 в ячейку памяти № 2.Обратите внимание, что $h1
все еще указывает на ячейку памяти # 1, а $h2
все еще указывает на ячейку памяти # 2.Таким образом, значения $h1
и $h2
не меняются, но меняется то, на что они указывают.
Теперь давайте рассмотрим %a
и %b
.Содержимое %a
находилось в ячейке памяти # 1, а содержимое %b
находилось в ячейке памяти # 2.В sub foo
мы не меняли информацию в ячейке памяти # 2, поэтому значение %b
не изменилось.
В sub bar
мы перепутали содержимое ячейки памяти #2, поэтому значение %b
(которое хранит его содержимое в ячейке памяти № 2) изменилось.
Кстати, обратите внимание, что изменение %a
после вызова подпрограммы не изменится %b
совсем.Они могут использовать одно и то же содержимое, но они не являются одной и той же переменной.