values and Data::Alias

"Perl Best Practices" 読んで知った Data::Alias と最近(ようやっと)気がついた values の本来の使われ方。

#!/usr/local/bin/perl

use strict;
use warnings;

my %city = (
    Japan => 'Tokyo',
    Korea => 'Seoul',
    UK    => 'London',
);

foreach my $value ( values %city ) {
    $value .= ' is capital of ';
}

foreach my $key ( keys %city ) {
    printf "%-25s %s\n", $city{$key}, $key;
}

実行してみる。

% ./test.pl
London is capital of      UK
Seoul is capital of       Korea
Tokyo is capital of       Japan

values で得た scalar の値は変更すると元の HASH の値も変更する。values と keys の本質的な違いですね。values 今まで便利に使っていなかったYO。こんなことも知らない自分が恥ずかしい。

#!/usr/local/bin/perl

use strict;
use warnings;
use Data::Alias;

my %city = (
    Japan => 'Tokyo',
    Korea => 'Seoul',
    UK    => 'London',
);

foreach my $key ( keys %city ) {
    alias my $value = $city{$key};

    $value .= ' is capital of ';
}

foreach my $key ( keys %city ) {
    printf "%-25s %s\n", $city{$key}, $key;
}

keys で同じことをするには、 $city{$key} に値を直接代入するか、 Data::Alias を使って上のようにする。見た目スマートでしょ。

いわゆる参照渡しのようになる訳ですね。Data::Alias は他にも色々役に立ちそうだな。