Thread Experimental push on scalar is now forbidden (21 answers)
Opened by hlubenow at 2023-08-20 16:35

hlubenow
 2023-08-20 16:35
#195274 #195274
User since
2009-02-22
875 articles
BenutzerIn
[default_avatar]
Hallo,

in einer neueren Perl-Version (Perl 5.26.1 von OpenSuSE Leap 15.4) erhalte ich einen Fehler, wenn ich "push()" mit einer Array-Referenz verwenden will:
Code (perl): (dl )
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";
}

ergibt in Perl 5.26.1:
Code: (dl )
Experimental push on scalar is now forbidden at ...

Zuerst fand ich das lustig.
Aber leider muß sehr häufig "push()" mit einer Array-Referenz verwenden. Eigentlich ständig. Denn innerhalb von Klassen werden alle Arrays, die zur Klasse gehören (also Attribute sind), als Array-Referenzen verwaltet. Wenn man einem solchen Array etwas anfügen will - und das will man wie gesagt ständig - tritt sofort dieses Problem auf.
Ich behelfe mir mit einer eigenen Funktion "pushOnRef()" (unten ein Beispiel), und das scheint soweit auch zu funktionieren. Aber das kann's doch nicht sein. Ich möchte doch nicht in fast jedem Skript mit OOP diese komische Funktion mitschleppen müssen. Bietet Perl da nicht irgendwie eine bessere Möglichkeit? Oder ist das Problem in noch neueren Versionen von Perl wieder behoben?
Code (perl): (dl )
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();

View full thread Experimental push on scalar is now forbidden