Thread Debugging Hilfe bei Can't use string ("1") as a subroutine ref while "strict refs" in use
(8 answers)
Opened by bianca at 2020-12-16 11:25
Guten Tag!
In einem sehr umfangreichen Projekt habe ich den Fehler Can't use string ("1") as a subroutine ref while "strict refs" in use und finde die Ursache nicht. Ich weiß auch nicht, mit welcher Änderung ich mir den rein gehauen habe. Vom Prinzip her sieht das so aus: test_require1.pl: 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 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; local $Data::Dumper::Purity; $Data::Dumper::Purity = 1; local $Data::Dumper::Useqq; $Data::Dumper::Useqq = 1; local $Data::Dumper::Deparse = 1; $Data::Dumper::Deparse = 1; local $Data::Dumper::Sortkeys; $Data::Dumper::Sortkeys = sub { my ($hash) = @_; return [(sort {lc $a cmp lc $b} keys %$hash)]; }; use 5.010; system 'cls'; my @dispatch = ( { moduldatei => "./test_require2.pl", aufruf_sub => \&subname, }, ); my %varenv = (test1 => 'start'); my $href = $dispatch[0]; require $href->{moduldatei}; $href->{aufruf_sub}(\%varenv); say Dumper(\%varenv); test_require2.pl: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/perl use strict; use warnings; sub subname { my ($varenv) = @_; $varenv->{test2} = 'test2 ok'; if (!defined $varenv->{zeiger_geladen}) { my $code = require "./test_require3.pl"; $code->($varenv); } } return '1'; test_require3.pl: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 #!/usr/bin/perl use strict; use warnings; no warnings 'void'; sub { my ($varenv) = @_; $varenv->{test3} = 'hier bin ich!'; } Im Original mit angepassten Dateinamen und Zeilennr. lautet der Fehler: AH01215: Can't use string ("1") as a subroutine ref while "strict refs" in use at test_require2.pl line 12.: test_require1.pl, referer https:/// meine_intranet_url Dieses Konstrukt erzeugt den Fehler nicht sondern zeigt nur Struktur und Syntax. Wie finde ich den Fehler Was ich versucht habe: ich gehe davon aus, dass der Fehler in der test_require2.pl entsteht, weil die test_require3.pl schon zu einem früheren Zeitpunkt geladen wurde und der Ausdruck my $code = require "./test_require3.pl"; deshalb nur noch 1/true ergibt anstatt auf den Code zu zeigen. Deshalb habe ich in der test_require3.pl vor die sub Definition eine Debug Ausgabe mit $$ gesetzt und festgestellt, dass der Code im selben Prozess immer nur einmal von der test_require2.pl geladen wird, nicht vorher. Und jetzt weiß ich nicht weiter. Welche Umstände gibt es noch, die in solcher Syntax "1" verursachen? Was kann ich noch probieren? Danke 10 print "Hallo"
20 goto 10 |