2011年2月5日土曜日

[Perl] ハッシュのスライスとハッシュリファレンスのスライス

ハッシュからいくつかの値を配列として取りたい時に使えるスライスの紹介です。

my %hash = (
    key1 => 1,
    key2 => 2,
    key3 => 3,
);

# 普通に key2 と key3 の値を取る。
my @values1 = ($hash{key2}, $hash{key3});
print join(', ', @values1); # 2, 3

# スライスで key2 と key3 の値を取る。
my @values2 = @hash{qw/key2 key3/};
print join(', ', @values2); # 2, 3

$hash を都度タイプしなくていいので楽ですね。
続いて、ハッシュリファレンスだった場合の書き方。

my $hash_ref = {
    key1 => 1,
    key2 => 2,
    key3 => 3,
};

# 普通に key2 と key3 の値を取る。
my @values1 = ($hash_ref->{key2}, $hash_ref->{key3});
print join(', ', @values1); # 2, 3

# スライスで key2 と key3 の値を取る。
my @values2 = @{$hash_ref}{qw/key2 key3/};
print join(', ', @values2); # 2, 3

$hash_ref をデリファレンスしつつスライスした配列を返すため、
@{$hash_ref}{qw/key2 key3/}
という書き方になります。
続いてちょっと発展。

my @saiyans = (
    {name => 'ラディッツ', power => 1500,  is_prince => 0},
    {name => 'ナッパ',     power => 4000,  is_prince => 0},
    {name => 'ベジータ',   power => 18000, is_prince => 1},
);

# @saiyans から name をキーにした power のハッシュがほしい。
my %power = map {@{$_}{qw/name power/}} @saiyans;

# %power = (
#    'ラディッツ' => 1500,
#    'ナッパ'     => 4000,
#    'ベジータ'   => 18000,
# );

参考: perldata - Perl のデータ型(Slices)

0 件のコメント: