-1

キーが文字列でキーが配列であるハッシュがあります(複雑なのは、配列が角括弧で定義されていることです)。したがって、私のハッシュは次のようになります。

model = {
       'add'     =>  [
                      {'name' => 'abc1', 'value' => 'def' },
                      {'name' => 'abc2', value => 'ghi'} 
                     ],
       'remove'  =>  [
                       {'name' => 'abc1', 'value' => 'def' },
                       {'name' => 'abc2', value => 'ghi'}
                     ]
     };

だから私が達成しようとしているのは、配列モデルのハッシュを反復しようとすると-> {add} as

print $_->{name} foreach(model->{add})

それは動作しません。これは、配列が()ではなく[]にあるためだと思います。入力を考慮して変更することはできません。これを乗り越える方法を教えてください...

4

4 に答える 4

2
$model = { 'add' => [ {'name' => 'abc1', 'value' => 'def' },
                  {'name' => 'abc2', 'value' => 'ghi'} ],
       'remove' => [ {'name' => 'abc1', 'value' => 'def' },
                     {'name' => 'abc2', 'value' => 'ghi'} ] };

print $_->{name} foreach( @{ $model->{add} } );
于 2013-03-07T11:54:09.607 に答える
1

ステートメント:

print $_->{name} foreach(model->{add})

modelはベアワードであり、変数ではないため、機能しません。コードに次の2つのプラグマがある場合:

use strict;
use warnings;

このような間違いをすることはできません。warnings教えてくれます:

Unquoted string "model" may clash with future reserved word at ...
Name "main::model" used only once: possible typo at ...
Use of uninitialized value in print at ...

そしてstrictあなたに言うでしょう:

Can't use bareword ("model") as a HASH ref while "strict refs" in use at ...

ただし、これら2つのプラグマを有効にしていない場合、Perlは空の文字列を喜んで印刷し、すべてについて沈黙します。これにより、間違いを検出するのがかなり難しくなります。

これを処理する正しい方法は、ハッシュから正しいスカラー値を取得し、正しい印章を使用してそれを逆参照することです。あなたが鍵を見れば'add'

'add'     =>  [

配列参照が格納されていることがわかります。つまり、使用する印章はです@。参照を明確にするために、中括弧をサポートする必要があります。また、変数をとして参照する必要があります$model

print $_->{name} for @{ $model->{add} };

これはと同じです

my $adds = $model->{add};
print $_->{name} for @$adds;
于 2013-03-07T12:10:32.747 に答える
1

3レベルのネストされた構造があります。HashRefを含むArrayRefを含むHashRef。

my $model = { 
    'add' => [ 
        {
            'name' => 'abc1', 
            'value' => 'def' 
        }, {
            'name' => 'abc2', 
            value => 'ghi'
        } 
    ], 
    'remove' => [ 
        {
            'name' => 'abc1', 
            'value' => 'def' 
        }, {
            'name' => 'abc2', 
            value => 'ghi'
        } 
    ] 
};

これらのネストされた配列とハッシュにアクセスするには、ハッシュか配列かに応じて、それらを追加する%か、その前に追加して、それらを逆参照する必要があります。@

my $arrayref = $model->{add};

foreach my $hashref (@$arrayref) {
    print $hashref->{name}, "\n";
}
于 2013-03-07T12:01:09.867 に答える
0

何よりもまず使用use strict; use warnings;

スカラーは次のmodelように書く必要があります

my $model = { 'add' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ], 'remove' => [ {'name' => 'abc1', 'value' => 'def' }, {'name' => 'abc2', value => 'ghi'} ] };

print $_->{name} foreach( ( @{ $model->{ add } } ) );
于 2013-03-07T11:39:27.100 に答える