Как я могу взять ссылку на конкретное значение хэша в Perl? - PullRequest
5 голосов
/ 25 марта 2010

Как создать ссылку на значение в определенном хэш-ключе. Я попробовал следующее, но $$ foo пусто. Любая помощь очень ценится.

$hash->{1} = "one";
$hash->{2} = "two";
$hash->{3} = "three";

$foo = \${$hash->{1}};
$hash->{1} = "ONE";

#I want "MONEY: ONE";
print "MONEY: $$foo\n";

Ответы [ 3 ]

8 голосов
/ 25 марта 2010
use strict;
use warnings;
my $hash;

$hash->{1} = "one";
$hash->{2} = "two";
$hash->{3} = "three";

my $foo = \$hash->{1};
$hash->{1} = "ONE";
print "MONEY: $$foo\n";
5 голосов
/ 25 марта 2010

Включите строгие и предупреждения, и вы получите некоторые подсказки о том, что происходит не так.

use strict;
use warnings;

my $hash = { a => 1, b => 2, c => 3 };
my $a = \$$hash{a};
my $b = \$hash->{b};

print "$$a $$b\n";

В общем, если вы хотите делать что-то с кусочками или принимать refs , вы должны использовать старый стиль, сложенный синтаксический символ, чтобы получить то, что вы хотите. Вам может пригодиться справочник References , если вы не помните подробные сведения о синтаксисе свайных символов.

обновление

Как указывает murugaperumal , вы можете сделать my $foo = \$hash->{a}; Я могу поклясться, что попробовал это, и это не сработало (к моему удивлению). Я объясню, что усталость делает меня еще более глупой.

0 голосов
/ 14 мая 2019

классика, и все же примеры, кажется, не полны, пока вы не проиллюстрируете это в обоих направлениях

use strict;
use warnings;

my $hash = { abc => 123 };
print $hash->{abc} . "\n"; # 123 , of course

my $ref = \$hash->{abc};
print $$ref . "\n"; # 123 , of course

$hash->{abc} = 456;
print $$ref . "\n"; # 456 , change in the hash reflects in the $$ref

$$ref = 789;
print $hash->{abc} . "\n"; # 789 , change in the $$ref also reflects in the hash

PS: несмотря на старую тему, я решил бросить свои два цента, так как я видел, что посетил этот же вопрос раньше

...