Thread our & Perl 5.005 (30 answers)
Opened by BrownWolf at 2004-01-03 02:48

ptk
 2004-01-09 11:30
#77922 #77922
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=eisbeer,08.Jan..2004, 18:22]@ptk:
Nein, ich teste meine Programme nur laufend und vermeide so Fehler.
Und da ich sowieso max. 4 globale Hashes hab, ist der aufwand nicht sooo
gross.

Was hätte ich für Vorteile von z.B. use fields ? Noch kann ichs ändern,
noch bin ich relativ am Anfang meines neusten Projekts :)[/quote]
Gucken wir uns folgendes Skript an:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Bla;
use strict;
use fields qw(foo bar bla);

sub new {
fields::new(shift);
}

package main;

my $x = new Bla;
$x->{foo} = 1;
warn "Runtime";
$x->{vertippt} = 1;


Hier wird fuer Objekte der Klasse "Bla" festgelegt, dass es nur foo, bar und bla enthalten darf. Eine Zuweisung mit dem Key "foo" funktioniert, mit "vertippt" aber nicht. Das wird zur Laufzeit gemacht, wie die Ausgabe von "Runtime" beweist.

Man kann die Ueberpruefung sogar zur Compilezeit machen, indem man
Code: (dl )
my Bla $x = new Bla;
schreibt. Dann wird die Fehlermeldung ausgegeben, bevor das Skript ausgefuehrt wird.

Ein Nebeneffekt bei der Verwendung von "use strict" ist, dass intern Pseudo-Hashes verwendet werden, also Hashes, die intern als Arrays aufgebaut sind. Man erhoffte sich dadurch eine Steigerung der Performance, die aber nicht (oder kaum) aufgetreten ist.

Pseudo-Hashes laufen mit perl5.8.x aus. "use fields" wird weiterhin funktionieren, aber intern wird dann mit Hash::Util::lock_keys gearbeitet. Praktisch heisst das, dass nur die Runtime-Checks erhalten bleiben, aber nicht mehr die Compiletime-Checks.

Alternativen zu "use fields" sind beispielsweise Class::Accessor oder Class::Struct, wobei automatisch Methoden zum Auslesen und Beschreiben von Members erzeugt werden.

View full thread our & Perl 5.005