I строка ниже строки 9 создает локальную копию хэша. Любые изменения в% d не будут содержать изменения глобальной переменной% h (строка: 5). Я должен использовать ссылку (строка: 8), чтобы внести изменения в% h.хеш разыменования без создания локальной копии
Есть ли какой-либо способ разыменования хэша в sub без создания локальной копии? Я спрашиваю, так как у меня сложная запись со многими ссылками и перемещение вокруг нее с помощью разыменований было бы намного проще.
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 в sub с% 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 без создания локальной копии?
Из любопытства - что случилось с двумя указанными вами методами (встроенное разыменование с помощью $$ и оператора стрелки)? –
$$ is okey. Мне просто интересно. – name