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 は他にも色々役に立ちそうだな。