Jemand zu Hause?
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?
overload-Pragma ist dazu da, Objekte wie primitive Datentypen behandeln zu können. Objekte sind in Perl Referenzen: Referenzen können beispielsweise nicht sinnvoll addiert und subtrahiert werden, aber mit overload kann man Addition und Subtraktion so definieren, dass zwei Objekte addiert werden können. Bei Vektoren und Matrizen ist das ziemlich weit verbreitet, es macht das Hinschreiben der Gleichungen viel kompakter.
PDL ist ein Beispiel dafür, was man mit Objekten machen kann, deren Daten "nur" in XS-Code existieren.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." }