Perl: хэш внутри массива внутри хеша - PullRequest
1 голос
/ 19 ноября 2010

Я пытаюсь создать хэш, в котором массив имеет одно значение;этот массив будет содержать хэши.К сожалению, я неправильно его кодировал, и это интерпретируется как псевдо-хеш.Пожалуйста, помогите!

my $xcHash       = {};
my $xcLine;

#populate hash header

$xcHash->{XC_HASH_LINES} = ();

#for each line of data
    $xcLine       = {};

    #populate line hash

    push(@{$xcHash->{XC_HASH_LINES}}, $xcLine);

foreach $xcLine ($xcHash->{XC_HASH_LINES})
    #psuedo-hash error occurs when I try to use $xcLine->{...}

Ответы [ 4 ]

3 голосов
/ 19 ноября 2010
foreach $xcLine ($xcHash->{XC_HASH_LINES})

должно быть

foreach $xcLine ( @{ $xcHash->{XC_HASH_LINES} } )

См. http://perlmonks.org/?node=References+quick+reference, где легко запомнить правила для разыменования сложных структур данных.

3 голосов
/ 19 ноября 2010

$xcHash->{XC_HASH_LINES} - это ссылка на массив, а не массив.Так что

$xcHash->{XC_HASH_LINES} = ();

должно быть:

$xcHash->{XC_HASH_LINES} = [];

foreach занимает список.Это может быть список, содержащий один скаляр (foreach ($foo)), но это не то, что вам нужно.

foreach $xcLine ($xcHash->{XC_HASH_LINES})

должно быть:

foreach my $xcLine (@{$xcHash->{XC_HASH_LINES}})
2 голосов
/ 19 ноября 2010

Золотое правило # 1

use strict;
use warnings;

Поначалу это может показаться битвой, но они прививают хорошие практики Perl и помогают выявить многие синтаксические ошибки, которые в противном случае могли бы остаться незамеченными.*

Кроме того, в Perl есть замечательная функция, называемая автовивификацией.Это означает, что $xcHash и $xcLine не нужно предварительно определять или конструировать как ссылки на массивы или хэши.

Проблема, с которой здесь сталкиваются, связана с весьма распространенным понятием, что скаляр может содержать массивили хэш;это не так.То, что он держит, является ссылкой.Это означает, что $xcHash->{XC_HASH_LINES} является ссылкой на массив, а не массивом, поэтому его необходимо разыменовывать как массив с использованием нотации @{...}.

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

Вот что я бы сделал:

my %xcHash;

для каждой строки данных:

push @{$xcHash{XC_HASH_LINES}},$xcLine;
...