― Web Technology and Life ―

PerlモジュールのList::Utilの関数shffuleの罠

2011-05-03
「Perlの関数eachの罠」に続いて、予想外の挙動になったList::Utilのshffule関数の挙動についてメモです。

List::Utilのshffule関数について

shffuleを利用すると、配列の中身を関数名の通りシャッフルして新しい配列を作ることができます。

サンプルコード

#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw/shuffle/;
use Data::Dumper;

my @list = qw/a b c/;

my @shuffled_list = shuffle(@list);

warn Dumper \@shuffled_list;


my $shffled_scalar = shuffle(@list);

warn Dumper $shffled_scalar;

出力結果

$VAR1 = [
          'b',
          'a',
          'c'
        ];
$VAR1 = 'b';

上記のように、戻り値をスカラーで受けると、ランダムで最初の値を切り出し渡せます。

ハッシュの一つのkeyのvalueでshffuleを使うとスカラーで受けたことにならない

ハッシュのkeyのvalueに関数やメソッドを書いてそのままリターンバリューを閉じ込めるということはしばしば行うと思うのですが、shffuleの場合は失敗するというのが、この記事の本題です。以下のようになります。

サンプルコード

#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw/shuffle/;
use Data::Dumper;

my @list = qw/a b c/;

my %hash = (
    foo => 1,
    bar => shuffle(@list),
);

warn Dumper \%hash;

期待した出力結果

$VAR1 = {
          'bar' => 'a',
          'foo' => 1
        };

実際の出力結果

$VAR1 = {
          'c' => 'b',
          'bar' => 'a',
          'foo' => 1
        };

配列がハッシュの中で展開されて余計なkeyとvalueができていしまいますね。ちょっとした思い込みは、バグの発見を遅らせますね。今後気をつけたいです。

Perl update_at : 2011-05-03T19:02:40
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus