間違い探し
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が出なくても意図通りに動いてないハズなんだけどな。。。