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

bianca
 2020-12-16 11:25
#192993 #192993
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
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

View full thread Debugging Hilfe bei Can't use string ("1") as a subroutine ref while "strict refs" in use