たごもりすメモ

コードとかその他の話とか。

scalar context において sort の挙動は未定義

この問題についてなんですがね。
http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Subroutines/ProhibitReturnSort.pm

まあ未定義っつってもどうせリストの要素数返すんだろ! そう思っていた時期が俺にもありました。

試す

とりあえずこういうコードを書きます。

use strict;
use warnings;

sub hoge {
    my @a = (5, 3, 2, 6, 1);
    return (sort @a);
}

use Data::Dumper;
warn Dumper +{
    list => [hoge()],
    scalar => scalar(hoge()),
};

おもむろに実行します。

$ perl tmp/hoge.pl 
$VAR1 = {
          'list' => [
                      1,
                      2,
                      3,
                      5,
                      6
                    ],
          'scalar' => undef
        };

うっひょー。perl 5.18.1 でこれ出ます。知らなきゃうっかりハマりそうですね。

ということで、ソートした結果を返す sub を作りたい場合はいちど配列に入れてから返すようにしたほうがいいですね!

とはいえ

リストの要素数欲しいなら普通こう書くよね。だって改めて中身のデータが欲しい時にまた hoge() 呼ぶの?ってなるし。

my @list = hoge();
warn Dumper +{
    list => \@list,
    scalar => scalar(@list),
};

なんで、現実的にはあんまりハマることなさそうだなーという気がしますが。

あとがき

この記事は Perl Advent Calendar 2013 の 12月10日 の記事でした! 空いてたところにネタが降ってきたのでさくっと書いた!
明日は debug-ito さんです!