Я понял (трудный путь), что оператор eq
дает фатальную ошибку времени выполнения, когда один из операндов является объектом с перегруженной строкой.
Вот минимальный пример:
my $test = MyTest->new('test');
print 'yes' if $test eq 'test';
package MyTest;
use overload '""' => sub { my $self = shift; return $self->{'str'} };
sub new {
my ( $class, $str ) = @_;
return bless { str => $str }, $class;
}
Результат этого:
Operation "eq": no method found,
left argument in overloaded package MyTest,
right argument has no overloaded magic at ./test.pl line 7.
Мое ожидание от чтения perlop заключалось бы в том, что строковый контекст принудительно используется для обоих операндов, запуская метод строковой привязки в $test
, затем сравниваются полученные строки, Почему это не работает? Что на самом деле происходит?
Контекст, в котором я столкнулся с этой проблемой, был в script, который использует как autodie
, так и Try::Tiny
. В блоке try
я die
с некоторыми конкретными сообщениями, которые нужно поймать. Но в блоке catch
, когда я тестирую, является ли $_ eq "my specific message\n"
, это дает время выполнения, если $_
является autodie::exception
.
Я знаю, что мне придется заменить $_ eq "..."
на !ref && $_ eq "..."
, но я хотел бы знать, почему.