Perl 当一个参数的字符串化过度时,“eq”为什么不起作用?

Perl 当一个参数的字符串化过度时,“eq”为什么不起作用?,perl,operator-overloading,stringification,Perl,Operator Overloading,Stringification,我已经意识到(困难的是),当其中一个操作数是具有重载字符串化的对象时,运算符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 ( $cl

我已经意识到(困难的是),当其中一个操作数是具有重载字符串化的对象时,运算符
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.
我对读取的期望是,字符串上下文将强制作用于两个操作数,在
$test
中触发字符串化方法,然后比较结果字符串。为什么不起作用?究竟发生了什么

我遇到这个问题的背景是在一个同时使用
autodie
Try::Tiny
的脚本中。在
try
块中,I
die
将捕获一些特定消息。但是在
catch
块中,当我测试
$\ueq“我的特定消息”
,如果
$\ucode>是
autodie::exception
,这将给出一个运行时


我知道我将不得不用
替换
$\ueq“…”
!ref&&$\ueq“…”
,但我想知道原因。

您只重载了字符串化,而没有重载字符串比较。但是,如果指定
回退=>1
参数,则
重载杂注将使用重载字符串化进行字符串比较:

my $test = MyTest->new('test');
print 'yes' if $test eq 'test';

package MyTest;

use overload
    fallback => 1,
    '""' => sub { my $self = shift; return $self->{'str'} };

sub new {
    my ( $class, $str ) = @_;
    return bless { str => $str }, $class;
}
有关其工作原理的详细信息:

当递给重载对象时,
eq
操作符将尝试调用
eq
重载。我们没有提供重载,也没有提供可以自动生成
eq
cmp
重载。因此,Perl将发出该错误


使用,错误被抑制,Perl将执行它无论如何都会执行的操作–将参数强制为字符串(这会调用字符串化重载或其他魔法),并对它们进行比较。

尝试
“$test”eq'test'
@HunterMcMillen,这很有效,谢谢。但我看不出这对口译员有什么影响
eq
comparison实际上并没有强制将
$test
字符串化,它只是对其参数使用字符串比较。