Scalar::Util und die Hoffnung

Über ein Modul im CPAN, wo sich über die direkte Benutzer von UNIVERSAL::isa als statische Methode beschwert wurde, wurde ich auf das Modul Scalar::Util aufmerksam. Das wurde nämlich als sichere Alternative genannt um heraus zu finden ob ein Scalar „geblessd“ wurde und wenn ja, mit was.

Generell finde ich die direkte Benutzer von UNIVERSAL-Methoden auch unpraktisch, weil man z.B. Dekorierern so jede Chance nimmt, sich als fremde Klasse aus zu geben. Also habe ich mir die Methode mal angesehen, und fand folgenden Code vor:

[...]
eval < <'ESQ' unless defined &dualvar;
use vars qw(@EXPORT_FAIL);
push @EXPORT_FAIL, qw(weaken isweak dualvar isvstring set_prototype);
# The code beyond here is only used if the XS is not installed
# Hope nobody defines a sub by this name
sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }
sub blessed ($) {
local($@, $SIG{__DIE__}, $SIG{__WARN__});
length(ref($_[0]))
? eval { $_[0]->a_sub_not_likely_to_be_here }
: undef
}
[...]

Quelle: http://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/lib/Scalar/Util.pm

Ok, es wird nur verwendet, wenn der C-Code nicht ausgeführt werden kann, aber eine Methode a_sub_not_likely_to_be_here in Universal ungefragt zu hinterlegen um zu prüfen, ob es ein Objekt ist? Bäää! Von wegen Hope nobody defines a sub by this name. Wohl eher Hope nobody use this module, denn wenn der Perl-Code schon so aussieht… dann ist der C-Code wohl auch gaaanz toll. Hoffentlich?!?

Nur so nebenbei *klugscheiß*: Prüfungen auf „ist ein Objekt der Klasse“ „ist ein Objekt“ gehen ganz gut per Universal::isa(ref($obj), ‚UNIVERSAL‘), aber das war in dem Fall wohl zu einfach (obwohl es auch passieren kann, dass es eine Klasse namens ‚HASH‘ gibt, dann ist die Prüfung natürlich nicht korrekt). Aber man wollte wohl den statischen Aufruf von Universal::isa um jeden Preis umgehen.

Nachtrag: Man sollte den Code besser testen bevor man was schreibt. Auf ein Objekt kann sicher gestetet werden per die „obj ist ein Objekt“ if(ref($obj) && UNIVERSAL::isa($obj, ‚UNIVERSAL‘))

Noch mal zur Erinnerung, und für Micha: Perl rockt! Das CPAN aber nicht! Oder zumindest nur in sehr seltenen Fällen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert