Perl Как получить доступ к хешу, являющемуся элементом массива, который является значением другого хеша?

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

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

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

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

Здесь,

Мой основной хэш -> senseInformationHash

Мое значение -> это массив

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

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

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

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

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


person Radz    schedule 12.11.2010    source источник
comment
Соответствующим FM для R является Поваренная книга Perl Data Structures. Вы можете получить его, запустив perldoc perldsc в терминале или перейдя по ссылке perldoc.perl.org/perldsc.html в вашем браузере. В статье есть примеры работы с множеством разных типов смешанных структур данных.   -  person daotoad    schedule 12.11.2010


Ответы (3)


Просто пиши

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

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

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

person tchrist    schedule 12.11.2010
comment
Не могли бы вы сказать мне, как получить к нему доступ после сохранения таким образом? - person Radz; 12.11.2010
comment
@Радз: printf "value of %s is %d\n", $word, $sense_information_hash{$sense}[1]{$word}; - person tchrist; 12.11.2010
comment
@Radz: это это способ получить к нему доступ. Вы даете ему путь к данным и говорите, что бы там ни было, увеличивайте счетчик. - person Axeman; 12.11.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 полезно понять, почему.

person ysth    schedule 12.11.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"; 
    }
}

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

person Radz    schedule 12.11.2010