1

配列を1つの値として持つハッシュを作成しようとしています。この配列にはハッシュが含まれます。残念ながら、私はそれを間違ってコーディングしました、そしてそれは疑似ハッシュとして解釈されています。助けてください!

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

4 に答える 4

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

する必要があります

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

複雑なデータ構造を逆参照する方法の覚えやすいルールについては、http://perlmonks.org/ ?node = References + quick+referenceを参照してください。

于 2010-11-19T17:16:11.447 に答える
3

$xcHash->{XC_HASH_LINES}はarrayrefであり、配列ではありません。それで

$xcHash->{XC_HASH_LINES} = ();

する必要があります:

$xcHash->{XC_HASH_LINES} = [];

foreachリストを取ります。単一のスカラー()を含むリストにすることもできますが、それはforeach ($foo)ここで必要なことではありません。

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

する必要があります:

foreach my $xcLine (@{$xcHash->{XC_HASH_LINES}})
于 2010-11-19T17:22:06.070 に答える
2

ゴールデンルール#1

use strict;
use warnings;

最初は喧嘩のように見えるかもしれませんが、Perlの優れたプラクティスを浸透させ、他の方法では見過ごされがちな多くの構文エラーを特定するのに役立ちます。


また、Perlには自動生存と呼ばれる優れた機能があります。これは、配列またはハッシュへの参照として事前定義または構築する必要がないこと$xcHashを意味します。$xcLine

ここで直面する問題は、スカラーが配列またはハッシュを保持できるという珍しいことではない概念に関係しています。そうではありません。それが保持しているのは参照です。これは、$xcHash->{XC_HASH_LINES}が配列ではなくarrayrefであることを意味します。そのため、@{...}表記を使用して配列として逆参照する必要があります。

于 2010-11-19T17:26:49.390 に答える
0

これが私がすることです:

my %xcHash;

データの各行について:

push @{$xcHash{XC_HASH_LINES}},$xcLine;
于 2010-11-19T17:10:26.353 に答える