Как получить доступ к элементам массива, хранящимся в хэше? - PullRequest
1 голос
/ 28 марта 2011

Я работаю над сценарием и пытаюсь получить некоторые значения из массива, хранящегося в хэше.После поиска в Google, поиска вопросов по SO (и есть вопросы с похожими названиями, но они остались нерешенными или решают проблемы, немного отличающиеся от моих), и после проверки Data Structures Cookbook и попыткивсе разумное, чтобы попытаться, я пришел попросить вашей помощи.

У меня есть хеш $action и массив $action->{'Events'}.Вот вывод для print Dumper($action->{'Events'});:

$VAR1 = [{
    'Muted'        => 'something',
    'Role'         => 'something',
    'Event'        => 'something',
    'Channel'      => 'something',
    'Talking'      => 'something',
    'UserNumber'   => 'somenumber',
    'CallerIDName' => 'somenumber',
    'Conference'   => 'somenumber',
    'MarkedUser'   => 'something',
    'ActionID'     => 'somenumber',
    'CallerIDNum'  => 'somenumber',
    'Admin'        => 'something'
}];

Мне нужно получить, например, значение $action->{'EVENTS'}->{'CallerIDName'}, но этот синтаксис и многие другие не будут работать.Я даже пробовал $action->{'EVENTS'}[6] и $action->{'EVENTS'}->[6] и т. Д.

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Это массив хешей, попробуйте так:

$action->{'EVENTS'}[0]->{'CallerIDName'}

Подробнее см. perldsc .


Обновлено Пример, например:

use strict;
use warnings;
use Data::Dumper;
my $action = {};
$action->{'Events'} = [{'Muted' => 'something',
            'Role' => 'something',
            'Event' => 'something',
            'Channel' => 'something',
            'Talking' => 'something',
            'UserNumber' => 'somenumber',
            'CallerIDName' => 'somenumber',
            'Conference' => 'somenumber',
            'MarkedUser' => 'something',
            'ActionID' => 'somenumber',
            'CallerIDNum' => 'somenumber',
            'Admin' => 'something'}];
#push hash into the array of hashes
push(@{$action->{'Events'}},{'Muted' => 'something',
              'Role' => 'something1',
              'Event' => 'something1',
              'Channel' => 'something1',
              'Talking' => 'something1',
              'UserNumber' => 'somenumber1',
              'CallerIDName' => 'somenumber1',
              'Conference' => 'somenumber1',
              'MarkedUser' => 'something1',
              'ActionID' => 'somenumber1',
              'CallerIDNum' => 'somenumber1',
              'Admin' => 'something1'} );
 for(my $i=0; $i < @{$action->{'Events'}}; $i++){
    print Dumper($action->{Events}[$i]); #print entire hash in array index $i
    #print callerIDName key(any key) of each hash
    print Dumper($action->{'Events'}[$i]->{'CallerIDName'});  
 }
2 голосов
/ 28 марта 2011

Вам не хватает того, что $ action содержит ссылку на массив, поэтому следующая часть должна разыменовать массив.Тогда внутри этого есть хеш, и вам нужно разыменовать хеш.Так это должно выглядеть следующим образом:

$action->{'EVENTS'}[0]{'CallerIDname'}

(обратите внимание, что -> после первого являются необязательными, так что это тоже хорошо:

$action->{'EVENTS'}->[0]->{'CallerIDname'}

И делает точныйтоже самое)

1 голос
/ 28 марта 2011

[] снаружи указывает, что хеш находится внутри массива. Так что попробуйте:

  $action->{Events}->[0]->{CallerIDName}

Вы можете опустить -> между {Событиями} и [0], но я предпочитаю это для ясности. Это не имеет значения здесь, но это делает в других местах. Для сравнения:

  @array = (1,2,3); 
  $arrayref = \@array; 
  print $arrayref[0];    # accesses non-existent array @arrayref

  print $arrayref->[0];  # '1'
...