1 2 3 4 5 6 7 8 9
#!/usr/bin/perl use warnings; use strict; my @a = qw(a b c); my $aref = \@a; push($aref, "d"); for my $i (@a) { print "$i\n"; }
Experimental push on scalar is now forbidden at ...
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
#!/usr/bin/perl use warnings; use strict; package Bag { sub new { my $classname = shift; my $self = {fruits => ["apple", "strawberry"]}; return bless($self, $classname); } sub pushOnRef { # Geht das nicht besser? my $self = shift; my $ref = shift; my $val = shift; my @temp = @{$ref}; push(@temp, $val); $ref = \@temp; return $ref; } sub addFruit { my $self = shift; my $fruit = shift; $self->{fruits} = $self->pushOnRef($self->{fruits}, $fruit); } sub show { my $self = shift; my @f = @{ $self->{fruits} }; print "\n"; for my $i (@f) { print "$i\n"; } print "\n"; } } my $bag = Bag->new(); $bag->addFruit("banana"); $bag->show();
1 2
$self->{names} = []; # Arrayreferenz in Klasseninstanz push @{$self->{names}}, 'Horst'; # usw.
1 2 3 4 5 6 7 8 9 10
$aref->push(); # und die Methode sub MyArray::push{ my $self = shift; push $self, @_; } .
push(@{self->{myarray}}, $value);
2023-08-21T00:59:24 hlubenow... und ich wundere mich ein bißchen, daß das geht.
Erzeugt "@{ $ref }" nicht ein neues (zunächst anonymes) Array?
perldoc -f push...
Starting with Perl 5.14, an experimental feature allowed "push" to take a scalar expression.
This experiment has been deemed unsuccessful, and was removed as of Perl 5.24.
...
2023-08-20T14:35:07 hlubenow... Denn innerhalb von Klassen werden alle Arrays, die zur Klasse gehören (also Attribute sind), als Array-Referenzen verwaltet.
2023-08-21T08:49:23 GwenDragon@hlubenow
$aref->@* ist doch viel klarer seit 5.20.
Eine Referenz namens $ref, die ein Array liefert.
Oder muss das für noch Älteres komatibel sein?
1 2 3 4 5 6 7 8 9 10
sub pushOnRef { # Geht das nicht besser? my $self = shift; my $ref = shift; my $val = shift; my @temp = @{$ref}; push(@temp, $val); $ref = \@temp; return $ref; }
1 2 3 4 5
sub push{ my $self = shift; my $ref = shift; push @$ref, @_; # fertig }
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
package RefArray; use strict; use warnings; sub TIESCALAR{ return bless [], shift } sub FETCH{ my $self = shift } # die Zuweisung an die Referenz ist hier in push sub STORE{ my $self = shift; push @$self, @_; } 1;################################# package main; use strict; use warnings; #Scalar wird gebunden tie my $arr, "RefArray"; # jede Zuweiung macht eiin push $arr = "Otto"; $arr = "Hanz"; $, = "\n"; print $arr->[0], $arr->[1]; # Otto Hanz