Thread Dereferenzierung klappt nicht (14 answers)
Opened by bianca at 2022-02-06 09:40

bianca
 2022-02-06 09:40
#194227 #194227
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Guten Morgen!
Im Rahmen eines etwas größeren Gesamtcodes habe ich eine Stelle bei der das Dereferenzieren nicht klappt.

Ein Ausschnitt des Codes:
Code: (dl )
1
2
3
my %tmp_io = %$io;
$tmp_io{links}{refer} = 4;# < Zeile 649
say "test: ".join('/',keys %{$io->{links}{refer}});# < Zeile 650

Und die Ausgabe:
Quote
Can't use string ("4") as a HASH ref while "strict refs" in use at sub_iteriere_verzeichnis.pl line 650.

Die zugewiesene 4 ist einfach irgend was, um den Fehler zu zeigen. Tatsächlich würde die Zeile so lauten: $tmp_io{links}{refer} = $io->{links}{refer}{$entry};
Und die würde dann im Gegensatz zu $tmp_io{links}{refer} = 4 dazu führen, dass zwar die Fehlermeldung nicht kommt, dafür aber neben %{$tmp_io{links}{refer}} auch noch %{$io->{links}{refer}} geändert wird, was natürlich genau nicht passieren darf.

Was mich ganz verrückt macht ist, dass ich es nicht nachstellen kann. Die Situation ist nach meinem Dafürhalten hiermit exakt abgebildet:
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
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);
use Date::Calc;
use Data::Dumper;
local $Data::Dumper::Purity = 1;
local $Data::Dumper::Useqq = 1;
local $Data::Dumper::Deparse = 1;
local $Data::Dumper::Sortkeys = sub {
    my ($hash) = @_;
    return [(sort {lc $a cmp lc $b} keys %$hash)]; 
};
use 5.010;

my %code = (
    testsub => sub{
        my ($coderef,$irgendwasref,$io) = @_;
        say "zu Beginn: ".Dumper($io);

        my %tmp_io = %$io;
        say "innen vorher : ".Dumper($io);
        $tmp_io{verkn} = $io->{verkn}{unterschluessel};
        say "innen nachher: ".Dumper($io);

        say "Kopie        : ".Dumper(\%tmp_io);
    },
);

my %irgendwas = (schluessel => {unterschluessel => {unterunter => 7}});
my %start = (
    foo     => 2,
    verkn   => $irgendwas{schluessel},
);

say "außen vorher : ".Dumper(\%start);
$code{testsub}->(\%code,\%irgendwas,\%start);
say "außen nachher: ".Dumper(\%start);

Dieser Code läuft genau wie gewünscht.
Kann das Problem damit zu tun haben, dass ein Hashkey eine Referenz auf ein anderes Hash ist?

Welche Magie ist hier im Spiel?
Bitte setzt mich mal auf's richtige Fehlerfinder-Gleis.
10 print "Hallo"
20 goto 10

View full thread Dereferenzierung klappt nicht