perl хэш массивов

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

for my $idx ( 0 .. $#vss ) {
    push (@{$vsnhash->{$vss[$idx]}}, $vsports[$idx]);
}
print Dumper(\%$vsnhash);

($VAR1 = {
      'name2' => [
                   '8001',
                   '8002'
                 ],
      'name1' => [
                   '8000'
                 ]
    };

Я могу получить доступ к ключам с помощью цикла foreach:

foreach my $key ( keys %$vsnhash ) {
print "$key\n";
}

Как получить доступ к массиву номеров портов ("8001", "8002") внутри хэша?
Спасибо за помощь!


person dars33    schedule 12.10.2011    source источник


Ответы (3)


$vsnhash{name2}->[0];   #8001
$vsnhash{name2}->[1];   #8002
$vsnhash{name1}->[0];   #8000

Мудрый код:

foreach my $key (sort keys %vsnhash) {
   foreach my $index (0..$#{$key}) {
      print "\$vsnhash{$key}->[$index] = " . $vsnhash{$key}->[$index] . "\n";
   }
}

$#{$key} означает последнюю запись в массиве @{$key}. Помните, что $key — это ссылка на массив, а @{$key} — это сам массив.

person David W.    schedule 12.10.2011

person    schedule
comment
Ух ты. Я понятия не имею, как это работает, но здорово узнавать что-то новое :) - person FailedDev; 12.10.2011
comment
@FailedDev: На самом деле это довольно просто. each похож на keys, но дает вам ключ и значение одновременно. @$v является сокращением от @{$v} и разыменовывает ссылку на массив. - person musiKk; 12.10.2011
comment
@musiKk Спасибо. Я никогда не использовал этот ярлык :) - person FailedDev; 12.10.2011
comment
Спасибо за ваше предложение! - person dars33; 12.10.2011

person    schedule
comment
В основном правильно, но у вас есть некоторые синтаксические ошибки. Должно быть: foreach my $port (@{$vsnhash->{$key}}){ вместо foreach my $port (@{$vsnhash{key}}){ - person Eric; 12.10.2011