2013-01-08 6 views
5

純粋に学問的な質問で、私はここでそれらを禁止する指示は表示されません。のような '学術的な'タグはありません。私は次のような既存のハッシュを持っている場合は関数からのハッシュリターンの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

ハードコーディングされたキーのリストは、それがハッシュであることを知っているからではありません。それは統語的なものです。 '@ {foo} {bar}'は常にハッシュスライスであり、常にfooがハッシュリファレンスを生成するコードであることを期待しています。 – ysth

+0

@ysthここに回答を投稿して、質問は終了します:) – gaussblurinc

+0

キャストはありません。 '@ {EXPR} {EXRP}' *はハッシュスライスです。おそらくあなたは逆参照を意味しましたか? – ikegami

答えて

6

、サブルーチンから平坦化ハッシュ(return %foo)を返す避けます。別のハッシュにコピーすることなく作業するのが難しくなります。ハッシュリファレンス(return \%foo)を返すほうがよい。

はい、それは最も分かりやすい方法です。 qw:

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