Ho realizzato (nel modo più duro) che l'operatore eq
dia un errore irreversibile al runtime quando uno degli operandi è un oggetto con stringificazione sovraccaricata.Perché `eq` non funziona quando un argomento ha sovraccaricato la stringa?
Ecco un esempio minimo:
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;
}
Il risultato dell'esecuzione di questo è:
Operation "eq": no method found,
left argument in overloaded package MyTest,
right argument has no overloaded magic at ./test.pl line 7.
La mia aspettativa dalla lettura perlop sarebbe tale contesto stringa è costretto su entrambi gli operandi, sparando l'in stringa metodo in $test
, quindi le stringhe risultanti vengono confrontate. Perché non funziona? Cos'è in realtà l'hapenning?
Il contesto in cui ho riscontrato questo problema era in uno script che utilizza sia autodie
e Try::Tiny
. Nel blocco try
, I die
con alcuni messaggi specifici da rilevare. Ma nel blocco catch
, quando provo se $_ eq "my specific message\n"
, questo dà un runtime se $_
è un autodie::exception
.
So che dovrò sostituire $_ eq "..."
con !ref && $_ eq "..."
, ma mi piacerebbe sapere perché.
try '" $ test "eq 'test'' –
@HunterMcMillen, ha funzionato, grazie. Ma non vedo che differenza fa all'interprete! – scozy
Il confronto 'eq' in realtà non obbliga' $ test' a essere univoco, usa solo la stringa compare sui suoi argomenti. –