Thread Dereferenzierung klappt nicht
(14 answers)
Opened by bianca at 2022-02-06 09:40
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 my %tmp_io = %$io; Und die Ausgabe: Quote 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 |