Leser: 26
1 2 3 4 5 6 7 8 9 10 11 12 13
sub new { my ($caller, %arg) = @_; #Konstruktoraufruf mit Skalar und Hash. my $caller_is_obj = ref($caller); #Was steht in $caller_si_object? Der Paketname? Was kann denn noch darin stehen? my $class = $caller_is_obj || $caller; #Wird vielleicht klar, wenn ich die Zeile zuvor verstehe. no strict "refs"; #warum macht man das hier? my $self = bless [\%{"${class}::FIELDS"}], $class; #Was ist das für ein erstes Argument??? ... .. }
my $self = bless [\%{"${class}::FIELDS"}], $class; #Was ist das für ein erstes Argument???
1 2 3 4 5 6 7 8 9 10 11
sub new { my ($caller, %arg) = @_; # $caller <- Paket oder Objekt, %arg <- restliche Argumente my $caller_is_obj = ref($caller); # Aufruf als Objekt- oder als Klassenmethode? my $class = $caller_is_obj || $caller; # Egal ob der Aufruf als Objekt- oder Klassenmethode erfolgte, $class <- Klassenname no strict "refs"; # Erlaube Zugriff auf Paketvariablen der Klasse über symbolische Referenzen my $self = bless [\%{"${class}::FIELDS"}], $class; # Erzeuge eine Arrayreferenz, die als erstes Element eine Referenz auf die Hashvariable FIELDS des Klassenpaketes enthält, und verwandle sie in eine Instanz der Klasse. ... }
2009-06-27T20:47:42 murphyCode (perl): (dl )1 2my $caller_is_obj = ref($caller); # Aufruf als Objekt- oder als Klassenmethode? }
2009-06-28T05:56:35 leo11
Ist das nun ein Aufruf als Objektmethode oder als Klassenmethode?
Wie sieht die andere Variante aus?
Was gibt ref($caller) jeweils zurück?
Ich vermute, dass das ein Aufruf als Klassenmethode ist. Dann bleibt $caller_is_obj leer und in $class steht CD::Music. Richtig?
my $cd2 = $cd->new();
2009-06-28T09:40:28 LanX-Was ist in "Mit Konstruktoren Objekte klonen / 3.4.1" unklar?
2009-06-28T05:56:35 leo11Was gibt ref($caller) jeweils zurück?
QuoteReturns a non-empty string if EXPR is a reference¹, the empty string otherwise.
...
If the referenced object has been blessed into a package, then that package name is returned instead. You can think of ref as a typeof operator.
2009-06-27T19:01:16 leo11Code (perl): (dl )my $self = bless [\%{"${class}::FIELDS"}], $class; #Was ist das für ein erstes Argument???
1 2 3
my $phash = [{NAME=>1,ISBN=>2}]; $phash->{NAME} = 'foo'; # => $phash->[1] = 'foo'; $phash->{ISBN} = 'bar'; # => $phash->[2] = 'bar';
QuotePseudo-hashes have been removed from Perl as of 5.10. Consider using restricted hashes or fields::new() instead. Using fields::phash() will cause an error.
$phash->[$phash->[0]->{ISBN}] = '12345';
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
package PseudoHash; use strict; use warnings; use List::Util qw/max/; # Constructor # Params: # $self = Existing object reference or package # @fields = Field names to be created in the new pseudo hash # Returns: # A new blessed object sub new { my ($self, @fields) = @_; my ($class, $layout) = do { if (my $class = ref $self) { ($class, $self->[0]); } else { ($self, {}); } }; if (@fields > 0) { $layout = { %$layout }; my $offset = max(0, values %$layout) + 1; foreach my $field (@fields) { $layout->{$field} = $offset++; } } bless [ $layout ], $class; } # Accesses a field of the pseudo hash by name # Params: # $self = Reference to the pseudo hash # $field = Name of the field # Returns: # An lvalue representing the field sub field : lvalue { my ($self, $field) = @_; my $offset = $self->[0]->{$field}; die "No such field '$field' in $self" unless (defined $offset); $self->[$offset]; }
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 31 32 33
use Data::Dumper; local ($,, $\) = (' ', "\n"); # Create a pseudo hash my $ph = new PseudoHash(qw/FOO BAR BAZ/); # Assign and read existing fields $ph->field('FOO') = 42; print 'FOO:', $ph->field('FOO'); $ph->field('BAR') = 23; print 'BAR:', $ph->field('BAR'); # Create a pseudo hash with identical structure as $ph my $pi = $ph->new(); # Assign and read an existing field $pi->field('BAR') = 23; print 'BAR:', $pi->field('BAR'); # Create a pseudo hash with structure based on $ph my $pj = $ph->new(qw/QUARK/); # Assign and read an existing field $pj->field('QUARK') = 'Hallo'; print 'QUARK:', $pj->field('QUARK'); # Show the structure of the pseudo hashes print Dumper [ $ph, $pi, $pj ]; # Try to access a non-existing field $ph->field('BOING'); # generates an error
2009-07-06T07:14:24 murphyMir ging es eigentlich nur um das Prinzip: Nur weil die Magie beim Zugriff nicht mehr gewünscht ist, muss die Datenstruktur nicht in jedem Falle unbrauchbar sein.