2013-01-08 35 views
5

純學術問題,我看不到在這裏禁止它們的指令(,雖然沒有'學術'標籤,我可以找到)。來自函數hash的Perl散列片返回

如果我有一個現有的哈希像下面這樣,我可以分得一杯羹它如圖所示(?):

my %hash = (one=>1, two=>2, three=>3, four=>4); 
my ($two, $four) = @hash{'two','four'}; 

有沒有辦法做到這一點,如果哈希是從一個實例函數返回喜歡這個?該工程

sub get_number_text 
{ 
    my %hash = (one=>1, two=>2, three=>3, four=>4); 
    return %hash; 
} 

一種方法是:

my ($two, $four) = @{ { get_number_text() } }{'two', 'four'}; 

據我瞭解,函數返回哈希鍵/值的列表,內{}創建一個匿名散列/ REF,並且@ {}因爲Perl知道ref是一個散列,所以使用引用將它「轉換」爲一個哈希切片的列表。 (我有點驚訝,最後一點工作,但更強大的Perl等)

但是,這是最明確的方式來寫在一個表達式中承認奇怪的訪問?

+2

這不是因爲它知道ref是一個散列;這是一個句法的東西。 '@ {foo} {bar}'總是一個散列片段,並且總是希望foo是生成散列引用的代碼。 – ysth

+0

@ysth在這裏發佈一個答案,問題將被關閉:) – gaussblurinc

+0

沒有鑄造。 '@ {EXPR} {EXRP}'*是一個散列片。也許你的意思是解除引用? – ikegami

回答

6

通常,避免從子例程返回一個扁平化的散列(return %foo);如果不將它複製到另一個散列中,它會變得更加困難。最好返回一個散列引用(return \%foo)。

但是,這是最明確的方式。雖然經常使用qw給出硬編碼密鑰列表:

my ($two, $four) = @{ { returnit() } }{ qw/two four/ };