Perl

Encode::decode_utf8の動作が変わってた

5.26を試してみるかとアップデートして見たらEncodeも更新されてdecode_utf8の動作が違った。
気になったので5.14.4以降、どこから変わったのか調査。

コード

#!/bin/perl
use warnings;
use strict;
use Encode;
use 5.14.4;
eval{
    my $str = 'あいうえお';
    say $str;
    $str = decode_utf8($str);
    say $str;
    $str = decode_utf8($str);
    say $str;
};
say $@;

※そもそもコードがばぐってるっていうのはお目こぼしを。

結果

Perlバージョン Encodeバージョン 結果
5.14.4 2.42 動いた
5.14.4 2.92 動かない
5.16.3 2.44 動いた
5.18.4 2.49 動いた
5.20.3 2.60 動かない
5.22.4 2.72 動かない
5.24.2 2.80 動かない
5.26.0 2.88 動かない
5.26.0 2.92 動かない

※Perl付属Encodeでの動作確認
※5.26.0と5.14.4は最新(2.92)を入れて確認

参考URL:http://blog.livedoor.jp/dankogai/archives/51290188.html

Validationの観点だけではなく、簡潔性の観点からも、Encode::decode_utf8()はおすすめです。すでに UTF-8 flag がついた文字列はそのままコピーするだけなので、条件分岐も不要です

と書いてあったので、割と気にせずにサブルーチン側でdecode_utf8をして処理を書いていたが先にチェックをする必要がある模様。
知識のアップデートも必要でした。
Encode.pmの中身までおっかける時間がなかったのでEncode側のバグなのか仕様変更なのかまでは調べていない。
他にもPerlのバージョンアップではまる人が居ないように残しておきます。