2012-06-11 33 views
5

下面的代碼工作正常有效的Perl 5.14.2:Perl的不兼容問題與每個哈希散列 - 5.14→5.8.8

my %hzones =(); 
#%hzones= (
# 'zone1' => { 
#     'ns1' => 'ip1', 
#     'ns1' => 'ip2', 
#     }, 
# 'zone2' => { 
#     'ns1' => 'ip1', 
#     'ns2' => 'ip2' 
#     } 
#); 

foreach my $k1 (keys %hzones) { 
    debug("# $k1",$d); 
    while (my ($key, $value) = each($hzones{ $k1 })) { # Problem is here 217 
     while (my ($nsname, $nsip) = each(%$value)) { 
      debug("## $nsname , $nsip",$d); 
    } 
    # Creation de la zone et ajout dans infoblox 
    $session->add(createZone($k1)) or error("Add zone for ".$k1." failed: ", 
     $session->status_code(). ":" .$session->status_detail()); 
    } 
} 

現在,如果我嘗試在RedHat 5.3使用此代碼用Perl 5.8.8,我有以下錯誤:

Type of arg 1 to each must be hash (not hash element) at 
    ./migration-arpa.pl line 217, near "}) " 
Execution of ./migration-arpa.pl aborted due to compilation 
    errors. 

問題:如何解決這個問題?我如何遍歷我的散列表?

+13

Perl 5.7是*古代* **開發**版本。不要使用它。 – Quentin

+2

Red Hat 5.3標配了Perl 5.8.8(參見http://vault.centos.org/5.3/os/i386/CentOS/)。如果您運行的是5.7版,那意味着有人已將您的Perl版本降級到Perl的開發版(即不穩定版)。真的,不要把它用於任何嚴肅的工作。 –

+0

他說他在帖子中使用5.8.8。該主題必須是錯字。固定。 – ikegami

回答

17

什麼昆汀說,但你可以嘗試用

each(%{$hzones{ $k1 }}) 

其取消引用哈希裁判更換

each($hzones{ $k1 }) 

+9

支持哈希引擎自動解除斥責[在Perl 5.14中增加](http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements)。 – Quentin

3

在5.14.0中,通過引用eacheach($hzones{ $k1 }))的能力是introduced。在此之前,必須通過散列(​​)。這仍然有效,它將繼續工作。

所以,爲了向下兼容,使用

each(%{ $hzones{ $k1 }) 

,而不是

each($hzones{ $k1 }) 

注:傳遞給each參考標記爲實驗性的,我認爲這是越野車,因爲它不與所有哈希一起工作。

+0

如果將參考文獻傳遞給'each',那麼在沒有'each'的情況下使用什麼是最佳選擇? – Yohann

+0

@Yhanhan,唯一的選擇(仍然使用'each')是傳遞一個散列,如圖所示。 – ikegami

+0

我很興奮,現在我同意,有太多奇怪的情況。我儘量不要使用它。不幸的是,我偶然忘記了在一個標量之前的'%'解除引用,代碼運行,所以我釋放了...並在5.14之前破壞了所有內容。哦,很好,很容易補救,但經驗教訓。 –