スライス&x演算子で初期化、よりもmapが好き

僕はmap派かなぁ。


screenshotCatalystのソースを見ていたら二項演算子スライスを使ってハッシュの初期化をしていた - kopug memo


スライス&x演算子使うやり方だとmy宣言と同時に書けないからあんまり好きくない。

 my %hash = map { $_ => 1 } @key; # myと同時に書ける

 my %hash;
 @hash{ @key } = (1) x @key; # myと同時に書けない

もっと言えば初期化の為に@keyとかを用意しなくて済むし。

 my %hash = map { $_ => 1 } qw/a b c/;

予め%hashや@keyが存在しているような状況ならスライス&x演算子使ってやることもあるけどね(元記事のCatalystのコードがまさにそう)。

ただ、x演算子で気をつけないといけないのがリファレンスを使って初期化するとき。

 use Data::Dumper;

 my @key = qw/a b c/;
 my %hash;
 @hash{ @key } = ([]) x @key;

 print Dumper \%hash;

 # output
 $VAR1 = {
          'c' => [],
          'a' => $VAR1->{'c'},
          'b' => $VAR1->{'c'}
        };

このように同じリファレンスを指す。

mapでやる場合は当然同じリファレンスにはならない。

微妙な違いだけどこの違いを意識しないまま速度向上のためmapからx演算子リファクタリングしたりするとどこかで痛い目にあうことがあるかもしれない。

この場合の速度の差なんて微々たる物だからどっちで書くかはあとは書く人の好き嫌いじゃないでしょうかねぇ。