Alexander (HH): Radiobuttons - Zusatzfragen

Beitrag lesen

my $Zahlmethode = &param('Zahlmethode');

Aaaaa! Bitte nicht die alte Perl4-Syntax, das ist Cargo Cult Programming und hat unter Perl5 einige unerfreuliche Nebenwirkungen.

Welche?

1. Die Prototypen-Prüfung wird explizit abgeschaltet, so dass zu viele, zu wenige oder falsche Parameter übergeben werden können. Wer wirklich genau weiß, was er tut, kann sowas vielleicht ein oder zweimal im Jahr gebrauchen, aber für jemanden, der sich mit Perl nicht auskennt, ist das eine Falle.

2. In der Form "&func;" wird implizit der *aktuelle* Wert von @_ als Parameter übergeben, nicht, wie man auf Grund des Verhaltens von "func;" eigentlich erwarten könnte, gar keine Parameter. Beispielcode unter http://www.perlmonks.org/?node_id=38191. Das ist die viel größere Falle, denn nicht nur wird die Prototypen-Prüfung abgeschaltet, sondern auch noch (für Anfänger) unvorhersehbare Parameter übergeben, die eigentlich (in den Augen eines Anfängers) gar nicht da sein sollten.

Zwei von vielen Diskussionen zum Thema gibt's unter http://www.perlmonks.org/?node_id=29126 (Stil) und http://www.perlmonks.org/?node_id=500367 (Performance).

3. Ein vorangestellter Ampersand blendet explizit die in Perl integrierten Funktionen aus, so kann man parallel zu den integrierten Funktionen eigene, identisch benannte Funktionen haben, wozu auch immer das gut sein soll. Problematisch für Anfänger ist aber neben zwei völlig verschiedenen Dingen mit scheinbar gleichen Namen, dass sich mit der &func-Schreibweise die eingebauten Funktionen nicht erreichen lassen:

$ perl -e 'open(FOO,"<bar")'
ok

$ perl -e 'open FOO,"<bar"'
ok

$perl -e '&open(FOO,"<bar")'
Undefined subroutine &main::open called at -e line 1.

$ perl -e '&open FOO,"<bar"'
Bareword found where operator expected at -e line 1, near "&open FOO"
        (Missing operator before FOO?)
syntax error at -e line 1, near "&open FOO"
Execution of -e aborted due to compilation errors.

Und spätestens hier verzweifelt der Anfänger an der völlig irreführenden Fehlermeldung auf Grund des völlig in die Irre geführten Interpreters.

Böse Frage: Wie schreiben &-Freunde einen Methodenaufruf? Wenn man unbedingt & im Code haben will, fällt mir spontan nur das ein:

&{&UNIVERSAL::can($objekt,'somemethod')}($objekt,@argumente);
&{&UNIVERSAL::can('KLASSE','somemethod')}('KLASSE',@argumente);

$objekt->somemethod(@argumente);
KLASSE->somemethod(@argumente);

... macht genau das gleiche, nur ohne Knoten in den Fingern und im Kopf.

Die CGI-Doku (http://perldoc.perl.org/CGI.html) sollte man auch gelegentlich mal lesen und verstehen.

Und wenn das Verstehen schon am Lesen scheitert? Ich kann zwar englische Texte "lesen", nehme aber viel weniger mit als wenn es deutsch (oder französisch) wäre.

http://www.oreilly.de/catalog/perlmodger/manpage/cgi.htm

Alexander