Thread Module inventarisieren ohne ExtUtils::Installed (26 answers)
Opened by bianca at 2013-04-24 11:25

bianca
 2013-04-24 13:17
#167232 #167232
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Bin ein kleines Stückchen weiter:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;

my $scan = sub {
  my %found;
  for my $dir (@_) {
    if (-d $dir) {
      my $topdir = $dir;
      find(
        sub {
          if (-f $File::Find::name && $File::Find::name =~ /\.pm$/ ) {
            my $fn = $File::Find::name;
            $fn =~ s/\Q$topdir//g;
            $fn =~ s/\//::/g;
            $fn =~ s/^:://g;
            $fn =~ s/\.pm//g;
            $found{$fn} = ($fn =~ tr/://) / 2;
          }
        },
        $dir
      );
    }
  }
  %found;
};

print "Beginne mit Modulsuche in '".join(';',@INC)."'\n";
my %found = $scan->(@INC);  # erstmal alle Unterverzeichniss einlesen
my @modules;
foreach my $name (sort {$found{$a} <=> $found{$b}} keys %found) {
  if ($found{$name}) {  # untere Hirarchien nicht mehr inventarisieren, z.B. nur Authen::SASL und nicht Authen::SASL::CRAM_MD5
    my @temp = split /::/,$name;
    my $flag = 0;
    for (my $z = 0; $z < scalar @temp - 1; $z ++) {
      if (defined $found{join('::',@temp[0..$z])}) {  # z.B. App::Packer::PAR hat nur die dritte Hirarchie
        $flag = 1;
        last;
      }
    }
    push @modules,$name if !$flag;
  }
  else { push @modules,$name; }
}

print "Beginne mit Versionsermittlung fuer ".(scalar @modules)." Modul(e)\n";
my (%ver,@fehler);
open STDERR,'>',"error.txt";  # hier landen haufenweise Fehlermeldungen, insgesamt 9 KB bei 560 Modulen
foreach my $name (@modules) {
  eval "use $name";
  my $v = $name->VERSION;
  if (defined $v) {
    $ver{$name} = $v
  }
  else { push @fehler,$name; }
}
foreach my $name (sort {lc $a cmp lc $b} keys %ver) { # hier funktioniert das sort{} schon nicht mehr
  print "$name -> $ver{$name}\n";
}
print "\nFehlerhafte (".(scalar @fehler)." Stueck):\n".join("\n",@fehler)."\n";


Frage: Kann es sein, dass die ganzen geladenen Module meinen Code beeinflussen? Stutzig machen mich die ganzen Fehlermeldungen in error.txt und die nicht sortiere Ausgabe am Ende trotz sort{}.
Kann man das Modul nach der Versionsabfrage auch wieder "entladen"?
Oder in einen abgeschotteten Bereich laden wo es mein Script nicht beeinflusst?
10 print "Hallo"
20 goto 10

View full thread Module inventarisieren ohne ExtUtils::Installed