perlmodule

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
vobie
Beiträge: 195
Registriert: 29.08.2003 21:14:50

perlmodule

Beitrag von vobie » 23.03.2006 14:21:12

hi,

wie kann ich abhängigkeiten von perlscripte rusfinden ?
ich möchte die benötigten perlmodule auf ein minimum reduzieren .

gibt es sowas wie ldd auch für perlmodule ??????

gruß

vobie

Benutzeravatar
godsmacker
Beiträge: 902
Registriert: 16.03.2003 21:50:26
Lizenz eigener Beiträge: Artistic Lizenz
Wohnort: Chemnitz
Kontaktdaten:

Beitrag von godsmacker » 23.03.2006 14:34:31

Es gibt Module::ScanDeps (libmodule-scandeps-perl). Aber generell ist es unmoeglich immer alle Abhaengigkeiten einer Perl Applikation zu finden. Die zur Kompilierzeit geladenen sind noch relativ einfach, die zur Lautzeit geladenen Module hingegen lassen sich nur mittels bestimmter Heuristiken ermitteln, was mit einer bestimmten Fehlerquote verbunden ist.


Gruesse,
Florian

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 24.03.2006 03:52:58

Ich hatte mal ein Script geschrieben, das einen Ordner durchsucht aus allen gefundenen Perlscripten die Module auflistet. Ich habe es genutz um nach einer Installation zu wissen welche Module noch fehlten. Man sollte damit auch herausfinden können welche module nicht gebraucht werden.
Das script ist nicht lang:

finde_pm.pl

Code: Alles auswählen

#!/usr/bin/perl
use strict;
my $find='find '.$ARGV[0].' -type f -exec perl -e \(\`file\ -b\ \"\$ARGV[0]\"\`=~/perl/\)\?exit\(0\):exit\(-1\) \{\} \; -print';
my @libs=();
warn "$0 Suche nach Perldateien\n";
my @files=`$find`;
warn "$0 Durchsuche gefundenen Dateien\n";
for my $file (@files)
{
 chomp($file);
 open(IN, '<', $file) or die "Konnte \"$file\" nicht öffnen ($!)\n";
 while(my $line=<IN>)
 {
  if($line=~/^\s*(?:use[\s(]|require[\s(])(.+?)[()\s;]/s)
  {
   my $mod=$1;
   push(@libs,$mod) unless(grep{ $mod eq $_}@libs);
  }
 }
 close(IN);
}
@libs=sort{$a cmp $b}@libs;
warn "$0 gebe Modulliste aus:\n";
print join("\n",@libs)."\n";
exit();
Es läuft aber recht lange wenn viele Unterverzeichnisse durchsucht werden müssen und und macht auch hin und wieder falsche Treffer.
Man ruft es so auf:

Code: Alles auswählen

perl finde_pm.pl /pfad/zum/verzeichnis

vobie
Beiträge: 195
Registriert: 29.08.2003 21:14:50

Beitrag von vobie » 30.03.2006 10:29:18

ToPeG hat geschrieben:Ich hatte mal ein Script geschrieben, das einen Ordner durchsucht aus allen gefundenen Perlscripten die Module auflistet. Ich habe es genutz um nach einer Installation zu wissen welche Module noch fehlten. Man sollte damit auch herausfinden können welche module nicht gebraucht werden.
Das script ist nicht lang:

finde_pm.pl

Code: Alles auswählen

#!/usr/bin/perl
use strict;
my $find='find '.$ARGV[0].' -type f -exec perl -e \(\`file\ -b\ "\$ARGV[0]"\`=~/perl/\)\?exit\(0\):exit\(-1\) \{\} \; -print';
my @libs=();
warn "$0 Suche nach Perldateien\n";
my @files=`$find`;
warn "$0 Durchsuche gefundenen Dateien\n";
for my $file (@files)
{
 chomp($file);
 open(IN, '<', $file) or die "Konnte "$file" nicht öffnen ($!)\n";
 while(my $line=<IN>)
 {
  if($line=~/^\s*(?:use[\s(]|require[\s(])(.+?)[()\s;]/s)
  {
   my $mod=$1;
   push(@libs,$mod) unless(grep{ $mod eq $_}@libs);
  }
 }
 close(IN);
}
@libs=sort{$a cmp $b}@libs;
warn "$0 gebe Modulliste aus:\n";
print join("\n",@libs)."\n";
exit();
Es läuft aber recht lange wenn viele Unterverzeichnisse durchsucht werden müssen und und macht auch hin und wieder falsche Treffer.
Man ruft es so auf:

Code: Alles auswählen

perl finde_pm.pl /pfad/zum/verzeichnis
danke, nicht schlecht !

gruß
vobie

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 30.03.2006 11:25:04

Nur mal am Rande: es gibt fuer Perl auch ein Modul, das sowas macht: Module::ScanDeps
Dabei ist auch ein kleines Perlskript namens scandeps.pl, das man auf einzelne Dateien oder auch ganze Verzeichnisse loslassen kann und das einem dann ausspuckt, welche Module so benutzt werden.

Antworten