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

murphy
 2010-02-07 17:00
#132143 #132143
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Mein vorhergehendes Codebeispiel verwendet no strict qw/refs/; und gibt nur Skalarvariablen aus. Hier noch eine Variante, die mit use strict; funktioniert und auch Arrays und Hashes ausdruckt:
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
use 5.010;
use strict;
use warnings;

use Data::Dumper;
local $Data::Dumper::Purity = 1;
local $Data::Dumper::Useqq = 1;

for my $var (keys %main::) {
  my $glob = $main::{$var};

  my $name = *$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);
    };

    for my $part (qw/ARRAY HASH/) {
      my $ref = *$glob{$part};
      print Data::Dumper->Dump([ $ref ], [ "*$name" ]) if (ref $ref);
    }
  }
}

Der Code überspringt die Variablen deren Namen auf "::" enden, also die Symboltabellen von Paketen, da sich sonst zumindest bei mir der Perlinterpreter aufhängt oder abstürzt. Ferner werden Skalare nur ausgegeben, wenn ihr Inhalt definiert ist, Arrays und Hashes nur, wenn sie existieren. Anscheinend gibt es keine Möglichkeit zu prüfen, ob der Skalaranteil eines Symboltabelleneintrages existiert, da *$glob{SCALAR} immer eine Referenz zurückliefert, selbst wenn nur eine Hash- und/oder Arrayvariable des passenden Namens existiert, wohingegen *$glob{ARRAY} bzw. *$glob{HASH} nur dann eine Referenz liefern, wenn eine Array- bzw. Hashvariable des passenden Namens existiert.
When C++ is your hammer, every problem looks like your thumb.

View full thread Vordefinierte Variablen anzeigen