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
块中,Idie
将捕获一些特定消息。但是在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
字符串化,它只是对其参数使用字符串比较。