2016-12-29 54 views
0

我已經寫了一個函數,通過包含一個有序的鍵數組作爲哈希的元素來按照規定的順序打印哈希。在perl中,我怎樣才能在父散列中引用散列元素?

由於可能有許多具有相同順序的子哈希,我希望能夠將順序字符串放在父哈希中,並在每個子哈希中引用它。 我無法讓它工作,如下面的代碼片段所示。

有沒有辦法做到這一點?

$hr={ 
    Order => [qw(Sp Ls)], 
    OrderSP => [qw(a b)], 
    Sp => { 
     a =>-1, 
     b => -1, 
     Order => @{$hr->{OrderSP}} 
     }, 
    Ls => { 
     c => -1, 
     d => -1, 
     Order => [qw(c d)] 
     } 
    }; 
print "\n\@{\$hr->{OrderSP}} = ",@{$hr->{OrderSP}}; # ab 
print "\n\@{\$hr->{Ls}->{Order}} = ",@{$hr->{Ls}->{Order}}; # cd 
print "\n\@{\$hr->{Sp}->{Order}} = ",@{$hr->{Sp}->{Order}}; # blank 

Result: 
@{$hr->{OrderSP}} = ab 
@{$hr->{Ls}->{Order}} = cd 
@{$hr->{Sp}->{Order}} = 
+0

嘗試把周圍的括號'@ {$ hr - > {OrderSP}}':'Order => [@ {$ hr - > {OrderSP}}]' –

+0

這看起來很像您已經解析過的東西 - 也許是一些帶有XML :: Simple的XML?如果是這樣,那麼可能有更好的方法來解決這個問題。 – Sobrique

回答

3

是的,有一種方法可以做到這一點。

你的代碼有兩個問題:

  1. 你解引用存儲在父的數組引用:@{$hr->{OrderSP}}。這沒有意義,因爲散列中的值必須是單個標量,而不是列表。刪除@{}會解決這個問題。
  2. 最重要的一點:您正嘗試使用尚不存在的數據結構。雖然正在評估作業的右側(並且構建了哈希,子哈希等),但尚未觸及$hr。實際分配只發生在數據結構建立後。

這裏有一個工作示例:

use strict; 
use warnings; 

my $hr = { 
    Order => [qw(Sp Ls)], 
    OrderSP => [qw(a b)], 
    Sp => { 
     a => -1, 
     b => -1, 
    }, 
    Ls => { 
     c => -1, 
     d => -1, 
     Order => [qw(c d)], 
    }, 
}; 

$hr->{Sp}{Order} = $hr->{OrderSP}; 

print "\@{\$hr->{OrderSP}} = @{$hr->{OrderSP}}\n"; 
print "\@{\$hr->{Ls}->{Order}} = @{$hr->{Ls}->{Order}}\n"; 
print "\@{\$hr->{Sp}->{Order}} = @{$hr->{Sp}->{Order}}\n"; 

輸出:

@{$hr->{OrderSP}} = a b 
@{$hr->{Ls}->{Order}} = c d 
@{$hr->{Sp}->{Order}} = a b 

關鍵的一點是,設置$hr->{Sp}{Order}已經拆分爲獨立的步驟,所以它只發生$hr->{OrderSP}有後已創建(分配到my $hr)。

或者你也可以這樣做:

my $OrderSP = [qw(a b)]; 
my $hr = { 
    Order => [qw(Sp Ls)], 
    OrderSP => $OrderSP, 
    Sp => { 
     a => -1, 
     b => -1, 
     Order => $OrderSP, 
    }, 
    Ls => { 
     c => -1, 
     d => -1, 
     Order => [qw(c d)], 
    }, 
}; 

這一次,我們的初始分配後不修改$hr。相反,我們事先將OrderSP存儲在一個單獨的變量中,然後我們可以從任何地方引用它。

(順便說一句,我也固定換行符在輸出"\n"是線終止;即它會在每一行,而不是開始的結束。)

+0

感謝您的幫助!你的第一個例子是我最初做的。但是這些Order陣列又大又重複,這就是爲什麼我試圖讓它們都指向一個地方。你的第二個例子當然可以解決這個問題,但我希望能夠使得哈希自成一體,所以我可以簡單地用printOrderedHash函數來調用它。所以,我想這是一個美學問題。 – user1067305