2013-03-07 72 views
-1

我有一個散列,其中的鍵是一個字符串,鍵是數組(複雜性是數組在方括號中定義),所以我的散列就像這樣..Perl-用方括號對散列數組進行迭代

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

那麼,我想才達到的是,當我試圖通過陣列 模型的哈希迭代 - > {}添加作爲

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

它不工作。 我想這是因爲該數組是在[]而不是()。 考慮到輸入無法更改。請讓我知道如何通過它來獲取...

+0

一個偉大的地方開始是[的perldoc perlreftut(http://p3rl.org/reftut)應解釋如何只是一些簡單的規則用數據結構來做任何你需要的事情。 – 2013-03-07 15:01:53

回答

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 } })); 
+0

不工作錯誤:在ab.pl第9行不推薦使用僞哈希。 在ab.pl第9行使用「strict refs」時,不能使用字符串(「value」)作爲HASH ref。 – user1737619 2013-03-07 11:44:57

+0

@ user1737619已編輯,現在檢查 – 2013-03-07 11:49:49

+0

現在正常工作。 – 2013-03-07 11:50:20

1

你有一個3級嵌套結構:一個包含HashRefs的ArrayRefs的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"; 
} 
+0

是否有任何方法來獲取數組中的鍵「名稱」的值與迭代通過它? – user1737619 2013-03-07 12:24:58

+0

@ user1737619否。數組中的每個元素都需要單獨訪問,因此需要迭代。 – TLP 2013-03-07 12:30:42

+0

您可以直接訪問元素,例如'$模型 - > {}添加[0] {名}'。但是這隻會讓你獲得數組中第一項的值。如果數組中只能有2個元素,則可以對第二個元素「$ model - > {add} [1] {name}'做同樣的事情。但是如果不止這些,你可能不得不迭代。通常我會推薦迭代。 – stevenl 2013-03-07 12:33:11

1

聲明:

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

不起作用,因爲model是裸詞,不是一個變量。如果您的代碼中包含以下兩個編譯指示:

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 ... 

但是,如果您沒有啓用這兩個編譯指示做,Perl將高興地打印空字符串,並且保持沉默整事情。這使得錯誤很難察覺。

處理這個問題的正確方法是從哈希中獲取正確的標量值,並使用正確的標識對其進行解引用。如果你看一下鍵'add'

'add'  => [ 

你會看到它有存儲在一個數組引用,這意味着使用印記是@。你需要支持花括號來消除引用的歧義。此外,您必須將您的變量稱爲$model

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

這是一樣的

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