Juli 2008 Archive

Das CPAN-Modul CPAN::FindDependencies von David Cantrell findet fast alle Abhängigkeiten (dependencies) für CPAN-Module.

Beispielprogramm für die Konsole

#!/usr/bin/perl
use strict;
use warnings;
use ExtUtils::MakeMaker;
use CPAN::FindDependencies;

my $mod = prompt("Bitte den Namen des Perl-Moduls eingeben: ");

my @dependencies = CPAN::FindDependencies::finddeps($mod);
foreach my $dep (@dependencies) {
    print ' ' x $dep->depth();
    print $dep->name().' ('.$dep->distribution().")\n"
}

Beispiel1: Abhängigkeiten für das Modul CPAN

Bitte den Namen des Perl-Moduls eingeben:   CPAN

CPAN (A/AN/ANDK/CPAN-1.9205.tar.gz)
 Scalar::Util (G/GB/GBARR/Scalar-List-Utils-1.19.tar.gz)
 Test::Harness (A/AN/ANDYA/Test-Harness-3.12.tar.gz)
  File::Spec (K/KW/KWILLIAMS/PathTools-3.2701.tar.gz)
   Carp (R/RG/RGARCIA/perl-5.10.0.tar.gz)
   Module::Build (K/KW/KWILLIAMS/Module-Build-0.2808.tar.gz)
   ExtUtils::CBuilder (K/KW/KWILLIAMS/ExtUtils-CBuilder-0.23.tar.gz)
 Test::More (M/MS/MSCHWERN/Test-Simple-0.80.tar.gz)
 File::Temp (T/TJ/TJENNESS/File-Temp-0.20.tar.gz)

Beispiel2: Abhängigkeiten für das Modul CPAN::FindDependencies

Bitte den Namen des Perl-Moduls eingeben:  CPAN::FindDependencies

WARNING: CPAN::FindDependencies: GBARR/CPAN-DistnameInfo-0.07: no META.yml
WARNING: CPAN::FindDependencies: GAAS/MIME-Base64-3.07: no META.yml
WARNING: CPAN::FindDependencies: GAAS/Digest-MD5-2.36: no META.yml
WARNING: CPAN::FindDependencies: GAAS/HTML-Parser-3.56: no META.yml
CPAN::FindDependencies (D/DC/DCANTRELL/CPAN-FindDependencies-2.0.tar.gz)
 Parse::CPAN::Packages (L/LB/LBROCARD/Parse-CPAN-Packages-2.27.tar.gz)
  Test::More (M/MS/MSCHWERN/Test-Simple-0.80.tar.gz)
   Test::Harness (A/AN/ANDYA/Test-Harness-3.12.tar.gz)
    File::Spec (K/KW/KWILLIAMS/PathTools-3.2701.tar.gz)
     Scalar::Util (G/GB/GBARR/Scalar-List-Utils-1.19.tar.gz)
     Carp (R/RG/RGARCIA/perl-5.10.0.tar.gz)
     Module::Build (K/KW/KWILLIAMS/Module-Build-0.2808.tar.gz)
     ExtUtils::CBuilder (K/KW/KWILLIAMS/ExtUtils-CBuilder-0.23.tar.gz)
  IO::Zlib (T/TO/TOMHUGHES/IO-Zlib-1.09.tar.gz)
   Compress::Zlib (P/PM/PMQS/Compress-Zlib-2.012.tar.gz)
    IO::Uncompress::Gunzip (P/PM/PMQS/IO-Compress-Zlib-2.012.tar.gz)
     Compress::Raw::Zlib (P/PM/PMQS/Compress-Raw-Zlib-2.012.tar.gz)
     IO::Uncompress::Base (P/PM/PMQS/IO-Compress-Base-2.012.tar.gz)
  version (J/JP/JPEACOCK/version-0.76.tar.gz)
  Class::Accessor::Fast (K/KA/KASEI/Class-Accessor-0.31.tar.gz)
   base (R/RG/RGARCIA/base-2.12.tar.gz)
  CPAN::DistnameInfo (G/GB/GBARR/CPAN-DistnameInfo-0.07.tar.gz)
 YAML (I/IN/INGY/YAML-0.66.tar.gz)
 URI::file (G/GA/GAAS/URI-1.37.tar.gz)
  MIME::Base64 (G/GA/GAAS/MIME-Base64-3.07.tar.gz)
 Module::CoreList (R/RG/RGARCIA/Module-CoreList-2.15.tar.gz)
 LWP::Simple (G/GA/GAAS/libwww-perl-5.813.tar.gz)
  Net::FTP (G/GB/GBARR/libnet-1.22.tar.gz)
  Digest::MD5 (G/GA/GAAS/Digest-MD5-2.36.tar.gz)
  HTML::Parser (G/GA/GAAS/HTML-Parser-3.56.tar.gz)
  HTML::Tagset (P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz)

Die oben gezeigten Warnungen (no META.yml) zeigen an, das der Author des Moduls keine Metainformationen zu den Abhängigkeiten mitgeliefert hat. Daher können hier keine weiteren Abhängigkeiten ermittelt werden.

Graphische Darstellung

Wer eine graphische Darstellung der Abhängkeiten bevorzugt, sollte einen Blick auf CPAN dependencies and test results checker riskieren.

Beispiel 3: Graphische Darstellung der Abhängigkeiten für das Modul CPAN (wie Beispiel1):

/2008/07/CPANdependenciesandtestresultschecker.png

Siehe auch

Ooops

Etwas wie

open TMPFILE ">/tmp/work.$$";
print TMPFILE ...

ist praktisch immer ein Programmierfehler. Hier wird zum Einen der unsichere Aufruf von open() mit zwei Argumenten statt der sichereren Form mit drei Argumenten verwendet und zum Anderen ist das Muster zur Erzeugung der temporären Datei viel zu einfach.

Bordmittel sind reichlich vorhanden

Perl stellt zur Erzeugung temporärer Dateien einige sichere Methoden zur Verfügung, z.B. anonyme temporäre Dateien und das Standardmodul File::Temp.

Anonyme temporäre Dateien

Seit Perl 5.8 besteht die Möglichkeit anonyme temporäre Dateien zu erzeugen, indem open() anstelle eines Dateinamens undef als Parameter übergeben wird.

Beispiel:

#!/usr/bin/perl
use strict;
use warnings;

my $fh;

open($fh,"+>",undef) or die "Could not open temp file - $!";

	# Daten in Temp-Datei schreiben

foreach my $line ( 1 .. 5 ) {
        print $fh "$line\n";
}

	# Daten aus Temp-Datei lesen

	# Zum Anfang der Datei
seek($fh, 0, 0);

while(<$fh>) {
	print;
}

close($fh) or die "Could not close temp file - $!";

exit();

File::Temp

File::Temp ist seit Perl 5.6.1 ein Standardmodul, d.h. es wird mit Perl ausgeliefert und läuft auf jeder Plattform, die von Perl unterstützt wird.

Dokumentation und API werden selbst von sehr gutmütigen Menschen bestenfalls als verwirrend bezeichnet.

Nachfolgend einige Beispiele, die Ihnen den Einstieg in File::Temp schrittweise erleichtern sollen.

Beispiel 1

Dieses Beispiel verwendet die Standardwerte von File::Temp.

#!/usr/bin/perl
use warnings;
use strict;

use File::Temp qw/ tempfile tempdir /;

my ($dir, $fh, $filename, $line);

$dir = tempdir( CLEANUP =>  1 );
($fh, $filename) = tempfile( DIR => $dir );

binmode($fh);

print "Verzeichnis: $dir\n";
print "Datei:       $filename\n";

	# Daten in Temp-Datei schreiben
foreach $line ( 1 .. 5 ) {
	print $fh "$line\n"; 
}

        # Daten aus Temp-Datei lesen
        # Zum Anfang der Datei
seek($fh,0,0);

while ($line = <$fh>) {
	print $line;
}

exit();

Ausgabe unter Linux

Verzeichnis: /tmp/ZT4Udprbvy
Datei:       /tmp/ZT4Udprbvy/4DOBscRn7o
1
2
3
4
5

Ausgabe unter Windows

Verzeichnis: C:\DOKUME~1\tf\LOKALE~1\Temp\LzIqqKVIga
Datei:       C:\DOKUME~1\tf\LOKALE~1\Temp\LzIqqKVIga\SL1tNeuIvV
1
2
3
4
5

File::Temp schreibt nicht einfach in eine Datei mit zufällig gewähltem Dateinamen, sondern legt zunächst ein Verzeichnis mit zufällig gewähltem Namen an, in dem dann die Datei angelegt wird.

Die Anweisung

$dir = tempdir( CLEANUP =>  1 );

sorgt dafür, das das temporäre Verzeichnis einschließlich der darin enthaltenen Dateien beim Beenden des Programms komplett gelöscht wird. Dieses Verhalten kann abgeschaltet werden durch

$dir = tempdir( CLEANUP =>  0 );

Aufräumen müssen Sie jetzt selbst.

Beispiel 2: Verzeichnis für temporäre Dateien festlegen

Wer vermeiden möchte, das File::Temp temporäre Dateien unterhalb der systemüblichen Verzeichnisse anlegt, z.B. wenn /tmp auf einer anderen Partition oder Festplatte liegt oder bei "Shared Webhosting", kann ein (bereits bestehendes) Verzeichnis über den Parameter DIR als Speicherort festlegen.

#!/usr/bin/perl
use warnings;
use strict;

use File::Temp qw/ tempfile tempdir /;

my ($dir, $mydir, $fh, $filename);

$mydir = './mydir'; 
mkdir $mydir unless -d $mydir;

$dir = tempdir( DIR => $mydir, CLEANUP =>  0 );

($fh, $filename) = tempfile( DIR => $dir );


print "Verzeichnis: $dir\n";
print "Datei:       $filename\n";

exit();

Das Programm erzeugt folgende Ausgabe:

Verzeichnis: mydir/2bQHkxZFqY
Datei:       mydir/2bQHkxZFqY/lKyMkclvzR

Beispiel 3: Extension für Dateinamen setzen

Dateiendungen lassen sich über den Parameter SUFFIX festlegen.

#!/usr/bin/perl
use warnings;
use strict;

use File::Temp qw/ tempfile tempdir /;

my ($dir, $mydir, $fh, $filename, $suffix);

$mydir = './mydir'; 
mkdir $mydir unless -d $mydir;

	# Dateiendung festlegen
$suffix = '.tmp';

$dir = tempdir( DIR => $mydir, CLEANUP =>  0 );

($fh, $filename) = tempfile( DIR => $dir,
                             SUFFIX => $suffix,
                           );

print "Verzeichnis: $dir\n";
print "Datei:       $filename\n";

exit();

Das Programm erzeugt folgende Ausgabe:

Verzeichnis: mydir/SmAZ7Dj9AO
Datei:       mydir/SmAZ7Dj9AO/eyi7h7fT0l.tmp

Beispiel 4: Länge des Dateinamens festlegen

File::Temp legt automatisch zufällige Dateinamen der Länge 10 an. Die Länge des Dateinames lässt sich durch Übergabe eines Templates als ersten Parameter an tempfile() ändern. Der Großbuchstabe X wird als Platzhalter für zufällige, von File::Temp erzeugte Buchstaben, Ziffern und Sonderzeichen verwendet.

#!/usr/bin/perl
use warnings;
use strict;

use File::Temp qw/ tempfile tempdir /;

my ($dir, $mydir, $fh, $filename, $suffix, $template);

$mydir = './mydir'; 
mkdir $mydir unless -d $mydir;

	# Dateiendung festlegen
$suffix = '.tmp';

# Dateinamen anpassen
# 12 zufällige Elemente (X)

$template = 'tmp_XXXXXXXXXXX';

$dir = tempdir( DIR => $mydir, CLEANUP =>  1 );

($fh, $filename) = tempfile($template,
                             DIR => $dir,
                             SUFFIX => $suffix,
                           );

print "Verzeichnis: $dir\n";
print "Datei:       $filename\n";

exit();

Das Programm erzeugt folgende Ausgabe:

Verzeichnis: mydir/73vWvvqRno
Datei:       mydir/73vWvvqRno/tmp_qzbFzrot_fe.tmp

Beispiel 5: Objektorientierung

File::Temp bietet neben der bereits gezeigten prozeduralen auch eine objektorientierte Schnittstelle an.

Das oben gezeigte Beispiel 4 lässt sich wie folgt auch objektorientiert schreiben.

#!/usr/bin/perl
use warnings;
use strict;

use File::Temp;

my ($dir, $mydir, $fh, $filename, $suffix, $template);

$mydir = './mydir'; 
mkdir $mydir unless -d $mydir;


# Temp-Verzeichnis unterhalb von $mydir erzeugen 
$dir = File::Temp->newdir( DIR     => $mydir,
                           CLEANUP => 1,
                         );

	# Dateiendung festlegen
$suffix = '.tmp';
# Dateinamen anpassen
# 12 zufällige Elemente (X)

$template = 'tmp_XXXXXXXXXXX';


$fh = File::Temp->new( TEMPLATE => $template,
                        DIR      => $dir,
                        SUFFIX   => $suffix,
                      );

print "Verzeichnis: ", $dir->dirname(),  "\n";
print "Datei:       ", $fh->filename(), "\n";

exit();

Ausgabe wie in Beispiel 4.

Siehe auch

Jedem Nutzer eines Computers wird eine eigene zentrale Datenablage, sein Heimatverzeichnis, zugewiesen.

Unterhalb des Heimatverzeichnisse werden zusätzlich noch weitere Verzeichnisse für bestimmte Daten, z.B. Bilder oder Musik, angelegt.

File::HomeDir

File::HomeDir von Adam Kennedy bietet eine betriebssystemunabhängige Möglichkeit das Heimatverzeichnis und die dazugehörigen Spezialordner zu ermitteln.

Die niedrige Versionsnummer (0.80) deutet es schon an: File::HomeDir ist noch nicht ganz ausgereift. Für einige typische, eher einfache Fälle kann es jedoch schon eingesetzt werden.

Beispiel (Aktueller User)

#!/usr/bin/perl
use strict;
use warnings;
use File::HomeDir;

# Aktueller User
my $home    = File::HomeDir->my_home;
my $desktop = File::HomeDir->my_desktop;
my $docs    = File::HomeDir->my_documents;
my $music   = File::HomeDir->my_music;
my $pics    = File::HomeDir->my_pictures;
my $videos  = File::HomeDir->my_videos;
my $data    = File::HomeDir->my_data;


print "Home:    $home    \n" if $home;
print "Desktop: $desktop \n" if $desktop;
print "Docs:    $docs    \n" if $docs;
print "Music:   $music   \n" if $music;
print "Bilder:  $pics    \n" if $pics;
print "Videos:  $videos  \n" if $videos;
print "Daten:   $data    \n" if $data;

Ausgabe unter Linux:

Home:    /home/tf    
Desktop: /home/tf 
Docs:    /home/tf    
Music:   /home/tf   
Bilder:  /home/tf    
Videos:  /home/tf  
Daten:   /home/tf

Ausgabe unter Windows:

Home:    C:\Dokumente und Einstellungen\tf
Desktop: C:\Dokumente und Einstellungen\tf\Desktop
Docs:    C:\Dokumente und Einstellungen\tf\Eigene Dateien
Music:   C:\Dokumente und Einstellungen\tf\Eigene Dateien\Eigene Musik
Bilder:  C:\Dokumente und Einstellungen\tf\Eigene Dateien\Eigene Bilder
Videos:  C:\Dokumente und Einstellungen\tf\Eigene Dateien\Eigene Videos
Daten:   C:\Dokumente und Einstellungen\tf\Lokale Einstellungen\Anwendungsdaten

Beispiel (Anderer User)

Dieses Beispiel funktioniert unter Windows leider noch nicht.

#!/usr/bin/perl
use strict;
use warnings;
use File::HomeDir;

# Anderer User
my $user = 'root';
my $home    = File::HomeDir->users_home("$user");
my $desktop = File::HomeDir->users_desktop("$user");
my $docs    = File::HomeDir->users_documents("$user");
my $music   = File::HomeDir->users_music("$user");
my $pics    = File::HomeDir->users_pictures("$user");
my $videos  = File::HomeDir->users_videos("$user");
my $data    = File::HomeDir->users_data("$user");


print "Home:    $home    \n" if $home;
print "Desktop: $desktop \n" if $desktop;
print "Docs:    $docs    \n" if $docs;
print "Music:   $music   \n" if $music;
print "Bilder:  $pics    \n" if $pics;
print "Videos:  $videos  \n" if $videos;
print "Daten:   $data    \n" if $data;

ActiveState Perl

ActiveState liefert File::HomeDir in der Version 0.69 aus. Aktuell ist Version 0.80.Daher sollte File::HomeDir besser per CPAN-Shell installiert werden und nicht per ppm.

C:\>perl -MCPAN -e shell
cpan> install File::HomeDir

Gnome, KDE und andere Desktops für Linux

Diverse Desktops für Linux legen, ähnlich wie Windows, spezielle Ordner für bestimmte Daten an. File::HomeDir findet diese Ordner in der Version 0.80 nicht. Das steht noch auf der Todo-Liste.

Web::Scraper , ist ein CPAN-Modul, welches das Scrapen von Websites mittels XPath oder CSS Selektoren ermöglicht.

Dokumentation und Beispiele sind leider Mangelware.

Max Maischein (corion) hat diese Lücke mit seinem Vortrag Web::Scraper - Daten aus Webseiten extrahieren, gehalten auf dem 10. Deutschen Perlworkshop, bravourös geschlossen.

Tatsuhiko Miyagawa verwirft im Talk Practical Web scraping with Web::Scraper (Slides) die Verwendung regulärer Ausdrücke und empfiehlt statt dessen die Verwendung von XPath oder CSS Selektoren für ein verlässliches Screen Scraping und die Verwendung von Web::Scraper.

Schöne Einführung in Web::Scraper.

Über dieses Archiv

Diese Seite enthält alle Einträge von Perl HowTo von neu nach alt.

Juni 2008 ist das vorherige Archiv.

August 2008 ist das nächste Archiv.

Aktuelle Einträge finden Sie auf der Startseite, alle Einträge in den Archiven.

Blog Roll

Powered by

Powered by Movable Type 5.2.10

Creative Commons-Lizenz

Creative Commons License
Dieses Weblog steht unter einer Creative Commons-Lizenz.