2010-10-28 22 views
4

我想要一個perl子例程,它通過Tie :: IxHash模塊創建並返回一個有序散列。它看起來是這樣的:在Perl中,如何從子例程返回一個並列散列?

sub make_ordered_hash { 
    my @hash_contents = munge_input(@_); # I get a list of alternating keys and values 
    tie(my %myhash, Tie::IxHash, @hash_contents); 
    return %myhash; 
} 

現在,如果我做my %ordered_hash = make_ordered_hash(@input_stuff),將%ordered_hash實際上被捆綁,或將它解壓縮%myhash,到一個列表,然後創建一個新的(普通,無序的)從哈希清單?如果我不能以這種方式返回並列散列,我可以返回一個引用嗎?也就是說,我可以通過讓make_ordered_hash返回\%myhash來修復它嗎?

回答

6

不可以。當你這樣做的時候你返回的是散列內容的副本,並且這個副本不是綁定的,就像你在第二段中推測的一樣。

你也是正確的,爲了實現你造成的,你需要一個refernce返回到並列哈希來代替:return \%myhash;

use Tie::IxHash; 

sub make_ordered_hash { 
    my @hash_contents = (1,11,5,15,3,13); 
    tie(my %myhash, Tie::IxHash, @hash_contents); 
    return %myhash; 
} 
sub make_ordered_hashref { 
    my @hash_contents = (1,11,5,15,3,13); 
    tie(my %myhash, Tie::IxHash, @hash_contents); 
    return \%myhash; 
} 

my @keys; 

my %hash1 = make_ordered_hash(); 
@keys = keys %hash1; 
print "By Value = @keys\n"; 

my $hash2 = make_ordered_hashref(); 
@keys = keys %$hash2; 
print "By Reference = @keys\n"; 

結果:

By Value = 1 3 5 
By Reference = 1 5 3 
+1

捆綁或不是,無論如何,返回一個大數據結構的ref可能是可取的(副本可能是昂貴的)。 – Thilo 2010-10-28 23:36:40

+0

@Thilo - 確實,儘管有時候你想要一個副本,例如當你將數據傳遞到不能保證不變的多個地方時。例如。在某些算法中將用作堆棧的列表。複製速度當然是一個有效的考慮因素,請記住它需要在全文中查看;) – DVK 2010-10-28 23:42:22

+0

同意。但在這種情況下,原始副本將會超出範圍並收集垃圾。而且,還有一種情況是您將數據傳遞給多個地方,並希望查看他們所做的更改。 – Thilo 2010-10-28 23:48:18

相關問題