勝手に Re:配列の値をキーにハッシュを生成するワンライナー

追記

Craftworksさんからコメントで教えてもらった個所を修正。コメントアウトしてるところ。
scalar消しました。


http://d.hatena.ne.jp/Craftworks/20090505/1241496331


スライスでも出来ます。(my宣言と代入を分ける必要があるのでワンライナーにはなりませんが)

use strict;
use warnings;

use Data::Dumper;

sub p { print Dumper shift }

my @array = ('foo', 'bar', 'baz');
my %hash;

#@hash{@array} = (1) x scalar @array;
@hash{@array} = (1) x @array;
p \%hash;
% perl slice.pl
$VAR1 = {
          'bar' => 1,
          'baz' => 1,
          'foo' => 1
        };


スライスを使った方が良い理由も有ります。
mapはループが発生しますが、スライスは発生しません。なのでスライスの方が高速です。

use strict;
use Benchmark qw/:all/;

my @array = ('foo', 'bar', 'baz');
my %hash;

sub by_map {
    %hash = map { $_ => 1 } @array;
}

sub by_slice {
#   @hash{@array} = (1) x scalar @array;
    @hash{@array} = (1) x @array;
}

cmpthese(1000000, {
        by_map   => sub { by_map()   },
        by_slice => sub { by_slice() },
});
% perl array2hash.pl
             Rate   by_map by_slice
by_map   130378/s       --     -74%
by_slice 505051/s     287%       --


…ということを、以前に神から教えてもらいました。