В Perl члены массива и хеша должны иметь одно значение.До Perl 5.0 не было (простого) способа сделать то, что вы хотите.
Однако в Perl 5 теперь можно использовать ссылку на ваш хэш.Ссылка - это просто область памяти, где хранится элемент.Чтобы получить ссылку, вы должны поставить обратную косую черту перед переменной:
use feature qw(say);
my $foo = "bar";
say $foo; #prints "bar"
say \$foo; #prints SCALAR(0x7fad01029070) or something like that
Таким образом:
my @switch_ports = ();
my %port = ( data1 => 0, data2 => 0, changed => 0 );
my $port_ref = \%port;
push( @switch_ports, $port_ref );
И вам не нужно создавать $port_ref
:
my @switch_ports = ();
my %port = ( data1 => 0, data2 => 0, changed => 0 );
push( @switch_ports, \%port );
Чтобы получить фактическое значение ссылки, просто поставьте символ на лицевой стороне:
#Remember: This is a REFERENCE to the hash and not the hash itself
$port_ref = $switch_ports[0];
%port = %{$port_ref}; #Dereferences the reference $port_ref;
print "$port{data1} $port{data2} $port{changed}\n";
Еще один ярлык:
%port = %{$port[0]}; #Dereference in a single step
print "$port{data1} $port{data2} $port{changed}\n";
Или, еще короче,разыменование по мере продвижения:
print ${$port[0]}{data1} . " " . ${$port[0]}{data2} . " " . ${$port[0]}{changed} . "\n";
И немного синтаксического подсластителя.Это означает то же самое, но легче читать:
print $port[0]->{data1} . " " . $port[0]->{data2} . " " . $port[0]->{changed} . "\n";
Взгляните на Perldoc perlreftut и perlref .Первый - учебник.