Программный доступ к хеш-элементу - PullRequest
0 голосов
/ 29 декабря 2011

Может кто-нибудь сделать этот отпечаток «4», заменив блок PFM ??

my %hash;
$hash{1}{2}{3}=4;

my @key=qw(1 2 3);

my $key;

for(@key){PFM}

print $hash{$key}

Ответы [ 3 ]

5 голосов
/ 29 декабря 2011
my $val = \%hash;
$val //= $val->{$_} for @key;
say $val;

или вы можете использовать Data :: Diver

use Data::Diver qw( Dive );
say Dive(\%hash, @key);

Ни одна из версий не оживет, если какая-либо часть ключа не существует.


Если вы хотите установить значение с помощью такой клавиши:

my $p = \\%hash;
$p = \( $$p->{$_} ) for @key;
$$p = 5;

или

use Data::Diver qw( DiveRef );
my $ref = DiveRef(\%hash, map \$_, @key);
$$ref = 5;

или

use Data::Diver qw( DiveVal );
DiveVal(\%hash, map \$_, @key) = 5;

(map \$_,требуется, чтобы Data :: Diver делал хэши вместо массивов для цифровых клавиш.)

5 голосов
/ 29 декабря 2011
my %hash;
$hash{1}{2}{3}=4;

my @key=qw(1 2 3);

my $data = \%hash;
for(@key){
  $data = $data->{$_}
}

print $data
0 голосов
/ 29 декабря 2011

Да.Но это, вероятно, не то, что вы хотели:

$key = "X";
$hash{X} = 4;

4 изначально не является значением хеша%:

my @fours = grep $_ == 4, values %hash;
print "[@fours]\n"; # prints '[]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...