Thread Vordefinierte Variablen anzeigen (52 answers)
Opened by bianca at 2010-02-07 13:20

bianca
 2014-10-19 08:04
#177893 #177893
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
Ah, jetzt kommt was. Aber nur über Webserver, nicht über Kommandozeile. Also schnell alles isoliert, was im Echtscript noch alles geladen wird und festgestellt, dass die abweichenden Umgebungsvariablen aus CPAN:Archive::Zip kommen:
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;
use 5.10.0;
use Archive::Zip qw(:ERROR_CODES :CONSTANTS);

for my $var (sort {lc $a cmp lc $b} keys %main::) {
    my $glob = $main::{$var};
    if (ref \$glob ne 'GLOB') {
        my $ref = ref \$glob;
        say "$glob: ref=$ref";
        say "$var: $glob: ref=$ref";
        if (ref \$glob eq "SCALAR") { say $$glob }
    }
}


Quote
SCALAR(0x2552e24): ref=REF
AZ_ERROR: SCALAR(0x2552e24): ref=REF
SCALAR(0x254cdb4): ref=REF
AZ_FORMAT_ERROR: SCALAR(0x254cdb4): ref=REF
SCALAR(0x44c474): ref=REF
AZ_IO_ERROR: SCALAR(0x44c474): ref=REF
SCALAR(0x2549464): ref=REF
AZ_OK: SCALAR(0x2549464): ref=REF
SCALAR(0x26d8bcc): ref=REF
AZ_STREAM_END: SCALAR(0x26d8bcc): ref=REF
SCALAR(0x26d9934): ref=REF
COMPRESSION_DEFLATED: SCALAR(0x26d9934): ref=REF
SCALAR(0x26d99f4): ref=REF
COMPRESSION_LEVEL_BEST_COMPRESSION: SCALAR(0x26d99f4): ref=REF
SCALAR(0x26d9994): ref=REF
COMPRESSION_LEVEL_DEFAULT: SCALAR(0x26d9994): ref=REF
SCALAR(0x26d99c4): ref=REF
COMPRESSION_LEVEL_FASTEST: SCALAR(0x26d99c4): ref=REF
SCALAR(0x26d9964): ref=REF
COMPRESSION_LEVEL_NONE: SCALAR(0x26d9964): ref=REF
SCALAR(0x26d9904): ref=REF
COMPRESSION_STORED: SCALAR(0x26d9904): ref=REF
SCALAR(0x254b8ac): ref=REF
FA_MSDOS: SCALAR(0x254b8ac): ref=REF
SCALAR(0x254b594): ref=REF
FA_UNIX: SCALAR(0x254b594): ref=REF
SCALAR(0x26d90f4): ref=REF
GPBF_DEFLATING_COMPRESSION_MASK: SCALAR(0x26d90f4): ref=REF
SCALAR(0x26d9064): ref=REF
GPBF_ENCRYPTED_MASK: SCALAR(0x26d9064): ref=REF
SCALAR(0x26d9144): ref=REF
GPBF_HAS_DATA_DESCRIPTOR_MASK: SCALAR(0x26d9144): ref=REF
SCALAR(0x26d9a84): ref=REF
IFA_BINARY_FILE: SCALAR(0x26d9a84): ref=REF
SCALAR(0x26d9a54): ref=REF
IFA_TEXT_FILE: SCALAR(0x26d9a54): ref=REF
SCALAR(0x26d9a24): ref=REF
IFA_TEXT_FILE_MASK: SCALAR(0x26d9a24): ref=REF


Das heißt, es gibt Umgebungsvariablen die anders aussehen als andere, richtig? Aber wie baue ich das jetzt in den Code ein, damit die Variable genau so gelistet wird wie die anderen?

Aus der Zeile my $name = *$glob{NAME}; würde ich my $name = (ref \$glob ne 'GLOB' ? $var : *$glob{NAME}); machen:
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
#!/usr/bin/perl
use strict;
use warnings;
use 5.10.0;
use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
use Data::Dumper;

for my $var (sort {lc $a cmp lc $b} keys %main::) {
    my $glob = $main::{$var};
    if (ref \$glob ne 'GLOB') {
        my $ref = ref \$glob;
        say "$glob: ref=$ref";
        say "$var: $glob: ref=$ref";
        if (ref \$glob eq "SCALAR") { say $$glob }
    }
    my $name = (ref \$glob ne 'GLOB' ? $var : *$glob{NAME});
    $name =~ s/([\x00-\x1f\x7f])/'^'.($1^'@')/eg;
    if ($name !~ /::$/) {
        do {
            my $ref = *$glob{SCALAR};
            print Data::Dumper->Dump([ $$ref ], [ $name ]) if (defined $$ref);
        };
    }
}

Dann bleibt immer noch ein Not a GLOB reference at test_perlvars.pl line 20.
Was muss ich da unten ändern?
10 print "Hallo"
20 goto 10

View full thread Vordefinierte Variablen anzeigen