1

Perl で非常に小さな問題が発生しています。

私はいくつかの情報のためにテキストファイルを読んでいます。テキスト ファイルを読みながら、テキストからいくつかのキーを選択します。さらに読むと、キーの値の配列を保存したいと思います。

例を参照してください

Alpha 1

Something: 2132
Something: 2134

Alpha 2

Something: 2132
Something: 2134

ファイルを lines という配列に読み込みます。

my $h;
my $alpha;
for my $line (@lines){
    if ($line =~ m/Alpha (\d+)/){
        $alpha = $1;
        $h->{$alpha} = (); # create empty array for key?
    }
    elsif ($line =~ m/Something: (\d+)/){
        push($h->{$alpha}, $1);
    }
}

どうやら、それは私にエラーを与えます:

Type of arg 1 to push must be array (not hash element) at test.pl line 28, near "$1)"
Execution of test.pl aborted due to compilation errors.

これを理解できません。

4

3 に答える 3

4

ハッシュ キー値には、スカラーのみを含めることができます。配列を保存したい場合は、配列参照に行く必要があります。

次のようなことができます。

for my $line (@lines){
    if ($line =~ m/Alpha (\d+)/){
        $alpha = $1;
        $h->{$alpha} = []; # create empty array refernece for key
    }
    elsif ($line =~ m/Something: (\d+)/){
        push( @{$h->{$alpha}}, $1);
    }
}
于 2013-03-07T05:20:23.060 に答える
3

2つの変更を加える必要があります。

    $h->{$alpha} = [];
                   ** - Create an anonymous array and store 
                        a ref to it in the hash

    push(@{$h->{$alpha}}, $1);

実際の配列がpush必要であり、配列参照があるためです。@ {...}ラッパーは、arrayrefを実際の配列に逆参照します。

于 2013-03-07T05:21:23.793 に答える
0

以前の回答が言うように、それらは正しいです。しかし、完璧ではありません。$alpha残る可能性がありますundef。したがって、それを回避するために、を追加してくださいcheck

my $alpha;
for my $line (@lines){
    if ($line =~ m/Alpha (\d+)/){
        $alpha = $1;
        $h->{$alpha} = []; # create empty array refernece for key
    }
    elsif ($line =~ m/Something: (\d+)/){
        if(defined $apha) { ## Check
           push( @{$h->{$alpha}}, $1);
        }
    }
}
于 2013-03-07T06:04:35.380 に答える