勝手に 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% --
…ということを、以前に神から教えてもらいました。