В коде ниже строки 9 создается локальная копия хэша. Любые изменения в% d не приведут к изменениям глобальной переменной% h (строка: 5). Я должен использовать ссылку (строка: 8), чтобы внести изменения в% h.
Есть ли способ разыменования хеша в сабвуфере без создания локальной копии?
Я спрашиваю, поскольку у меня сложная запись со многими ссылками, и навигация по ней с разыменованием будет намного проще.
1 #!/usr/bin/perl -w
2 use strict;
3 use warnings;
4
5 my %h;
6 sub a {
7
8 my $href = shift;
9 my(%d) = %{$href}; # this will make a copy of global %h
10
11 $$href{1}=2; # this will make a change in global %h
12 $d{2}=2; # this will not a change in global %h
13 }
14 a(\%h);
15 print scalar (keys %h) . "\n";
----------------
Спасибо за ответы.
Вопрос в том, можно ли создать какой-то псевдоним / связывание% h в подпрограмме.
Я хотел бы изменить контекст% h в подпрограмме с% d.
Всякий раз, когда я создаю% d, он делает локальную копию% h - есть ли способ избежать этого или мне нужно использовать ссылки постоянно?
----------------
Еще раз :) Я знаю, как работает $ href. Я читаю учебные пособия / руководства / документы и т. Д.
Я не нашел там ответа - я предполагаю, что это невозможно, так как там не было написано, но кто знает.
Я хочу добиться такого поведения:
6 sub a {
7 $h{"1"}=2;
8 }
Что эквивалентно этому:
6 sub a {
8 my $href = shift;
11 $$href{1}=2; # this will make a change in global %h
11 $href->{1}=2; # this will make a change in global %h
Теперь, как это сделать с помощью% d - возможно ли это на самом деле?
6 sub a {
7 my %d = XXXXXXXXX
.. }
Что я должен поместить в XXXXXXXXX, чтобы указать% h без создания локальной копии?