2009-08-24 123 views

回答

24

首先,你爲什麼不是use ing strictwarnings?以下幾行應該在您創建的每個Perl程序的頂部,位於#!/usr/bin/perl之後。 總是

use strict; 
use warnings; 

而且我知道你是不是因爲我敢肯定你會得到一些不錯的錯誤信息出來的從這個strictwarnings,並從代碼中的其他許多地方爲好,通過判斷你的變量使用。

其次,你爲什麼不這樣做:

for my $i (@pattern) { 
    .. 
} 

這通過每一個元素循環中@pattern,同時將其分配給$i之一。然後,在你的循環中,當你想要一個特定的元素時,只需使用$i。對$i所做的更改將反映在@pattern中,並且當循環退出時,$i將超出範圍,基本上會自行清理。

三,拉里牆的愛,my聲明變量來定位他們。我承諾,這真的不那麼難,它使你成爲一個更好的人。

第四,最後,你的數組將引用存儲爲散列值,而不是散列值。如果他們存儲散列,則代碼將會出錯,因爲散列以%開頭,而不是$。實際上,參考(任何類型)都是標量值,因此從$開始。因此,我們需要提領他們獲得哈希:

for my $i (@pattern) { 
    while(my($k, $v) = each %{$i}) { 
    debug(" $k: $v"); 
    } 
} 

或者,用自己的方式:

for (my $i = 0; $i<@pattern; $i++) { # added a my() for good measure 
    while(my($k, $v) = each %{$pattern[$i]}) { 
    debug(" $k: $v"); 
    } 
} 
+1

我愛你^^。是的,請使用「我的」... – 2009-08-24 07:35:25

+1

+1。 ;) – 2009-08-24 07:39:17

+0

哈哈,感謝您的回答,即使有很多需要閱讀的信息:p我正在尋找的是%{$ i}(或%{$ _})來重新獲得我的一些Perl榮譽)。 – Marius 2009-08-24 07:58:06

6

試試這個:

for my $hashref (@pattern) { 
    for my $key (keys %$hashref) { 
     debug "$key: $hashref->{$key}"; 
    } 
} 

並附上您嘗試什麼,最大的問題是each $pattern[$i]each函數需要一個散列來處理,但$pattern[$i]返回一個hashref(即對散列的引用)。您可以通過提領$pattern[$i]作爲哈希解決您的代碼:

while(my($k, $v) = each %{$pattern[$i]}) { 

另外,提防每一個功能,它可以leave the hash iterator in an incomplete state

+1

11打我秒。也許我應該漫不經心。 – 2009-08-24 07:30:19

+0

我嘗試快速發佈,然後回去漫步。 – 2009-08-24 07:36:50

+0

這是一個很好的策略。真的,我有很多東西要學。另外,關於爲什麼'each()'不好。我喜歡你的星球大戰參考。 – 2009-08-24 07:45:46