1
2
3
4
5
6
7
8
9
use overload "==" => \&my_compare;
sub my_compare {
my ($left, $right) = @_;
my $result =
($left cmp $right) # falls cmp != 0 liefert sind die ungleich
? 0
: 1;
return $result;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
use 5.020; use strict; use warnings; use overload '==' => \&my_compare; sub my_compare { my ($left, $right) = @_; my $result = ($left cmp $right) ? 0 : 1; warn $left, "|", $right; $result; } # ----------------------------------------------- my $name = 'Rara'; say (1 == 22); say ("1" == 1); say ( $name == "Rara" ); __END__ Nörgelt gleich los: Argument "Rara" isn't numeric in numeric eq (==) at T:\a.pl line 18. Argument "Rara" isn't numeric in numeric eq (==) at T:\a.pl line 18. 1 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14
use strict; use warnings; use overload bool => sub{shift}; use overload qq("") => sub{ my $self = shift; return $self->{name}; }; my $m = bless{name => 'foo'}; my $n = bless{name => 'bar'}; print $m; # foo
2024-08-24T13:01:00 LinuxerWeil ich beim Testen sah, dass cmp keine Warnung rauswirft.warum benutzt Du hier eigentlich cmp anstatt eq ? Hat das einen besonderen Grund?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
use 5.026; use Test::More tests => 3; use overload "==" => \&my_compare; sub my_compare { my ($left, $right) = @_; if (ref $left eq ref $right) { return $$left eq $$right; } elsif (! ref $right) { return $$left eq $right; } } sub comparable { my $name = shift; bless \$name; } my $name = comparable "Erwin"; my $hugo = comparable "Hugo"; ok($name == "Erwin", "Name ist Erwin"); ok("Erwin" == $name, "Name ist Erwin, auch andersrum"); ok(not ($name == $hugo), "Name ist nicht Hugo");
1 2 3 4 5 6 7 8 9 10 11 12 13 14
use strict; use warnings; use overload "==" => sub{ my $lv = shift; my $rv = shift; $lv->{name} eq $rv->{name}; }; my $m = bless{name=>"Fritz"}; my $n = bless{name=>"Fritz"}; print $m == $n;
QuoteAlso den eq-Operator überlagern mit "==" so daß ein if( $name == "Erwin" ) kein Fehler ist.
QuoteMit dieser Implementierung ist allerdings Deine ursprüngliche Forderung nicht erfüllt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
use strict; use warnings; use overload "==" => sub{ my $lv = shift; # blessed my $rv = shift; # plain text $$lv eq $rv; }; my $name = do{ my $s = "Fix"; bless \$s; }; print $name == "Fax";
QuoteAh, ich hatte da das Ziel der Nutzung overload falsch verstanden.Das overload-Pragma ist dazu da, Objekte wie primitive Datentypen behandeln zu können.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use strict; use warnings; use overload bool => sub{ my $self = shift; $self->{name}; }; use overload "==" => sub{ my $lval = shift; my $rval = shift; print "Links: $lval, Rechts: $rval\n"; }; my $m = bless{name => 'Erwin'}; $m == "Franze";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
use strict; use warnings; use overload bool => sub{ my $self = shift; $self->{name}; }; use overload "==" => sub{ my $lval = shift; my $rval = shift; #print "Links: $lval, Rechts: $rval\n"; my $lsum = do{ my @h = split //, $lval; my $sum = 0; $sum += unpack "C", $_ for @h; $sum; }; my $rsum = do{ my @h = split //, $rval; my $sum = 0; $sum += unpack "C", $_ for @h; $sum; }; return abs($lsum - $rsum) ? 0 : 1 ; }; my $m = bless{name => 'Erwin'}; if( $m == "Franze" ){ print "Die Namen sind gleich." } else{ print "Die Namen sind unterschiedlich." }