Perl Как получить доступ к хешу, который является элементом массива, который является значением другого хеша? - PullRequest
2 голосов
/ 12 ноября 2010

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

Первый элемент значения (который является массивом) является скаляром.Вторым элементом значения (который является массивом) является другой хеш.

Я поместил значения в ключ и значение этого хеша следующим образом:

${${$senseInformationHash{$sense}[1]}{$word}}++;

Здесь,

Мой главный хеш -> senseInformationHash

Мое значение -> Является ли массив

Итак, ${$senseInformationHash{$sense}[1]} дает мне ссылку на мой хэш

, и я вставляюключ и значение следующим образом:

${${$senseInformationHash{$sense}[1]}{$word}}++;

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

Любая помощь будет очень признательна.Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

Просто напишите

$sense_information_hash{$sense}[1]{$word}++;

и покончим с этим.

Знаете, Perl завидует CamelCase, поэтому вы должны использовать правильные подчеркивания. В противном случае он может плевать и сопротивляться и вообще плохо себя вести.

2 голосов
/ 12 ноября 2010

Хеш-значение никогда не является массивом, это ссылка на массив.

Чтобы убедиться, что вы все делаете правильно, вы можете выгрузить всю структуру:

my %senseInformationHash;
my $sense = 'abc';
my $word = '123';
${${$senseInformationHash{$sense}[1]}{$word}}++;
use Data::Dumper;
print Dumper( \%senseInformationHash );

, котораяполучает вас:

$VAR1 = {
      'abc' => [
                 undef,
                 {
                   '123' => \1
                 }
               ]
    };

Обратите внимание на \1: предположительно, вы хотите, чтобы значение было 1, а не ссылкой на скаляр 1. Вы получаете последнее, потому что ваш ${ ... }++; говорит, что обрабатывает то, что вфигурные скобки в качестве скалярной привязки и приращения упомянутого скаляра.

${$senseInformationHash{$sense}[1]}{$word}++; делает то, что вы хотите, как и $senseInformationHash{$sense}[1]{$word}++.http://perlmonks.org/?node=References+quick+reference может оказаться полезным, чтобы понять, почему.

0 голосов
/ 12 ноября 2010

Спасибо Axeman и TChrist.

Код, к которому я должен получить доступ, выглядит следующим образом:

    foreach my $outerKey (keys(%sense_information_hash))
{
  print "\nKey => $outerKey\n";
  print "  Count(sense) => $sense_information_hash{$outerKey}[0]\n";

        foreach(keys (%{$sense_information_hash{$outerKey}[1]}) )
    {
        print " Word wt sense => $_\n";
        print " Count  => $sense_information_hash{$outerKey}[1]{$_}\n"; 
    }
}

Это работает сейчас.Большое спасибо!

...