Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12163[/thread]

Vergleichsoperator für Objekte



<< >> 7 Einträge, 1 Seite
Gast Gast
 2008-07-11 13:56
#112015 #112015
Mahlzeit!

Ich wollte gern 2 Variablen (Objektdaten und Methodenparameter) vergleichen ob diese das gleiche Perl-Objekt referenzieren. Also nicht ob beide Objekte den gleichen Inhalt haben, sondern ob es wirklich das gleiche Objekt ist.

Was wäre dafür der Operator?

== geht ja nicht, weil eine Referenz obwohl es ja eigentlich nur eine Speicheradresse ist, in Perl nicht nummerisch ist. Oder irre ich da?

Also einfach nur "object stringyfication" über ein eq und dann ist gut? Scheint mir fast zu einfach.
renee
 2008-07-11 14:09
#112016 #112016
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
if( $obj1 eq $obj2 ){
    print "gleiches Objekt\n";
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2008-07-11 16:13
#112017 #112017
Also doch so einfach. Cool.

Danke sehr renee.
moritz
 2008-07-11 16:16
#112018 #112018
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-07-11 11:56:14--
== geht ja nicht, weil eine Referenz obwohl es ja eigentlich nur eine Speicheradresse ist, in Perl nicht nummerisch ist. Oder irre ich da?


Ja, du irrst dich ;-)

Im Zweifelsfall einfach mal ausprobieren:

Code: (dl )
1
2
3
moritz@trudi:~/src/parrot>perl -MCGI -wle 'my $x = new CGI; my $y = new CGI; print $x == $y; print $y == $y'

1


Die erste Bedingung ist falsch (leere Zeile), die zweite ist wahr (1).
esskar
 2008-07-11 17:04
#112021 #112021
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
renee+2008-07-11 12:09:38--
Code (perl): (dl )
1
2
3
if( $obj1 eq $obj2 ){
    print "gleiches Objekt\n";
}


da würde ich doch lieber == nehmen wollen.
fühlt sich besser an.
moritz
 2008-07-13 23:42
#112064 #112064
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Man sollte noch dazusagen, dass beides eventuell nicht funktioniert, wenn "" bzw. 0+ überladen ist. Was immer funktionieren müsste ist folgendes:

Code (perl): (dl )
1
2
3
4
use Scalar::Util qw(refaddr);
if (refaddr($obj1) == refaddr($obj2)){
     ...
}
betterworld
 2008-07-13 23:58
#112065 #112065
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Die Stringifizierung enthaelt neben der Adresse auch noch die Klasse des Objektes. Das ist zwar beim direkten Vergleich mit "eq" eigentlich kein Problem. Aber wenn man die Stringifizierung irgendwo speichert (zum Beispiel als Hashkey) und sich dann die Klasse des Objektes ändert (sprich, es wird bless aufgerufen), kann es unerwartete Effekte geben, wenn man die neue mit der alten Stringifizierung vergleicht.
Es kommt zwar selten vor, aber trotzdem Obacht ;)
<< >> 7 Einträge, 1 Seite



View all threads created 2008-07-11 13:56.