анализ моего $ file = $ {$ chainro -> {$ ro} -> {$ id}} [$ i]; - PullRequest
1 голос
/ 26 декабря 2011

У меня есть двухуровневый хэш %chainro, каждый ключ $chainro{$ro}{$id} указывает на массив.Следующий код должен перебрать первый уровень хеша, $chainro->{$ro}.Я могу догадаться, что my $file = ${$chainro->{$ro}->$id}}[$i]; стремится выполнить.Однако я не знаю, почему ${$chainro->{$ro}->{$id}} было написано таким образом?В частности, почему мы должны добавить $ {}, чтобы обернуть $chainro->${ro}->{$id}

foreach my $id (keys %{$chainro->{$ro}})
{
   $size = $#{$chainro->{$ro}->{$id}};
   for ($i=0; $i<$size; $i++)
   {
     my $file = ${$chainro->{$ro}->{$id}}[$i];
    }
}

Ответы [ 2 ]

6 голосов
/ 26 декабря 2011
${ EXPR1 }[ EXPR2 ]

- альтернативный способ записи

EXPR1->[ EXPR2 ]

, поэтому

${ $chainro->{$ro}->{$id} }[$i]

можно записать как

$chainro->{$ro}->{$id}->[$i]

или даже как

$chainro->{$ro}{$id}[$i]

Очищено:

for my $id (keys %{ $chainro->{$ro} }) {
   my $files = $chainro->{$ro}{$id};
   for my $i (0..$#$files) {
      my $file = $files->[$i];
      ...
   }
}

Или, если вам не нужно $i:

for my $id (keys %{ $chainro->{$ro} }) {
   my $files = $chainro->{$ro}{$id};
   for my $file (@$files) {
      ...
   }
}
1 голос
/ 26 декабря 2011

Это разыменование ссылки на что-то. Здесь что-то является массивом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...