2012-07-14 4 views
0

Я хочу присвоить хэш (возвращенный методом) в другой хеш для данного ключа.назначить хеш в хеш

Для, например, метод возвращает хэш этой формы:

hash1->{'a'} = 'a1'; 
hash1->{'b'} = 'b1'; 

Теперь я хочу, чтобы назначить эти хэш-значения в другой хэш в вызывающем методе, чтобы получить что-то вроде:

hash2->{'1'}->{'a'} = 'a1'; 
hash2->{'1'}->{'b'} = 'b1'; 

Будучи новым для perl, я не уверен, что это лучший способ сделать это. Но звучит тривиально ...

ответ

3

Ваш югу может быть:

#!/usr/bin/env perl 
use strict; 
use warnings; 

sub mystery 
{ 
    my($hashref) = { a => 'a1', b => 'b1' }; 
    return $hashref; 
} 

my $hashref1 = mystery; 
print "$hashref1->{a} and $hashref1->{b}\n"; 
my $hashref2 = { 1 => $hashref1 }; 
print "$hashref2->{1}->{a} and $hashref2->{1}->{b}\n"; 

Ключевым моментом является то, что ваша нотация для доступа к переменным с оператором стрелки -> имеет дело с хэш-рефов, а не с простыми хэшей.

+0

спасибо, это сработало хорошо! – Saket

1

У нас есть 1-ый и 2-ой хэш:

my %hash1 = (
    a => 'a1', 
    b => 'b1'); 
my %hash2 = (1 => undef); 

Мы можем только назначить скалярные значения хэшей, но это включает в себя ссылки. Для того, чтобы получить ссылку, используйте оператор обратной косой черты:

$hash2{1} = \%hash1; 

Теперь мы можем разыменования значения почти как в вашем примере:

print $hash2{1}->{a}; # prints "a1" 

Будьте осторожны, чтобы использовать правильный сигилы ($ @%) в зависимости от обстоятельств , Используйте сигилу типа данных, который вы ожидаете, который не обязательно должен быть объявленным вами типом.

"perldoc perlreftut" может быть интересным.

Смежные вопросы