ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

perl5.16から overloadが"overload arg '"' is invalid "みたいなwarningを吐き出した

間違い探し

use strict;
use warnings;
use 5.14.2;

package Foo {
    use overload '"' => sub { 'This is Foo class' };

    sub new { bless +{} => shift }
};

package main {

    # Fooクラスのインスタンスの文字列表現をとりたい
    my $foo = Foo->new;
    say $foo;
};

答え

-    use overload '"' => sub { 'This is Foo class' };
+    use overload '""' => sub { 'This is Foo class' };

5.14ではなんとも言われなかったのです、5.18に上げたら急に怒られてなんだなんだと思っていたところでした。


5.16からoverloadが1.18に上がったことにより、warningsが増えたことによるものですね。


overload はバージョン 1.13 から 1.18 に更新されました。

overload::Overloaded はもはやそのクラスの can を呼び出さず、 オブジェクトがオーバーロードされているかどうかを決定するのに他の方法を 使います。 これは can を呼び出すことでは決して修正されません; オーバーロードは AUTOLOAD を認識しないからです。 従って、メソッドをオートロードして can を実装しているクラスはもはや オーバーロードに数える必要はありません [perl #40333]。

不正な引数に対して警告が生成されるようになりました。 "New Diagnostics" を参照してください。

http://perldoc.jp/docs/perl/5.16.0/perl5160delta.pod#Updated32Modules32and32Pragmata

overload arg '%s' is invalid

"overload" カテゴリに入るこの警告は、overload プラグマが (おそらくは ミスタイプした演算子で) 認識できない引数を指定されたときに発生します。

http://perldoc.jp/docs/perl/5.16.0/perl5160delta.pod#New32Warnings

((少し古めとは言え、既存のcpanモジュールでいくつか怒られていたのでした。さてどうしようか・・。というか元のコード、warningsが出なくても意図通りに動いてないハズなんだけどな。。。