Perl Skript zum Erstellen von ZIP's - Probleme
SektOderSelters
- perl
Hallo Leute,
Ich habe einige Probleme mit einem Skript das ZIP-Dateien erstellen soll. Folgendes Skript funktioniert ganz gut ....
--------------------------------
#! /usr/bin/perl -w
use strict;
use lib ('/perl/lib/zip');
use Archive::Zip qw(:ERROR_CODES :CONSTANTS);
#my $zipName = shift(@ARGV);
my $zipName = 'hallo.zip';
my $zip = Archive::Zip->new();
#foreach my $memberName (map { glob } @ARGV)
foreach my $memberName (map { glob } '../Bilder/Fotosammlungen/Gotcha/*.*')
{
if (-d $memberName )
{
warn "Can't add tree $memberName\n"
if $zip->addTree( $memberName, $memberName ) != AZ_OK;
#if $zip->addTree( $memberName, 'bilder' ) != AZ_OK;
}
else
{
$zip->addFile( $memberName )
or warn "Can't add file $memberName\n";
}
}
writeToFileNamed($zipName);
print "Content-Disposition: inline; filename="$zipName" Content-Type: application/zip;\n\n";
open( ZIP, "<$zipName") || die "Datei wurde nicht gefunden\n";
while( <ZIP> ) {
print;
}
close( ZIP );
unlink($zipName);
----------------------------------------------------------
außer das die relativen Pfade in der Zip-Datei leider ein '../' enthalten. Das ist das erste Problem. Weiß jemand, wie man die Pfade in der ZIP-Datei ändern kann, so dass sie "nur" im Verzeichnis /Bilder/ liegen?.
Jetzt zum zweiten Problem. Wenn ich das Skript so umgestalte, dass Argumente an das Skript übergeben kann (im Quelltext die Zeiten die mit # deaktiviert sind -dann fällt natürlich die nächste Zeile im Skript weg - schaffe ich es scheinbar nicht, das Skript aus einem Brwoser aufzurufen und es ausführen zu können
Bsp.: <a href="http://www.domain.de/cgi-bin/ziptest.cgi?test1.zip+*.*"><b>Zip mich</b><font size="1"></font></a>
Scheinbar liegt es daran das Argumente per Browser immer mit diesen "" übergeben werden - aus meinem *.* wird so ein \.\. Test ich das Skript nämlich im Perl-Editor auf meinem Rechner, läuft es einwandfrei.
Meine Versuche die Zeichenkette $ARGV[2] so zu bearbeiten dass ich -Zeichen gelöscht werden endete damit, das ich an dessen Stelle ein Leerzeichen bekomme ( $text =~ tr/\/ /; ) ...
Ich hoffe jemand von euch weiß Rat ;-),
Vielen Dank,
Robert
Hallo Robert.
Scheinbar liegt es daran das Argumente per Browser immer mit diesen "" übergeben werden - aus meinem *.* wird so ein \.\. Test ich das Skript nämlich im Perl-Editor auf meinem Rechner, läuft es einwandfrei.
Für die Übergabe von Parametern an ein Script gibt es das CGI-Modul. @ARGV ist IIRC dafür nicht unbedingt gedacht. Aber wenn es schon so umständlich sein soll, dann findest du ein kommentiertes Beispiel in Selfhtml.
Meine Versuche die Zeichenkette $ARGV[2] so zu bearbeiten dass ich -Zeichen gelöscht werden endete damit, das ich an dessen Stelle ein Leerzeichen bekomme
Logisch:
$text =~ tr/\/ /;
heißt: ersetze einen Backslash durch ein Leerzeichen ('/ /'). Du meinst vermutlich sowas:
$text =~ s/\//g;
Freundschaft!
Siechfred
Hi Siechfred
$text =~ s/\//g;
klasse danke ;-)!
Hallo Siechfred,
Logisch:
$text =~ tr/\/ /;
heißt: ersetze einen Backslash durch ein Leerzeichen ('/ /'). Du meinst vermutlich sowas:
$text =~ s/\//g;
Nein, er meint vermutlich:
$text =~ tr/\//d;
Immerhin etwa 14x so schnell allerdings dafuer nur fuer einfache Suchen-und-ersetzen-
Ausdruecke geeignet:
Benchmark: timing 10000 iterations of s, tr...
s: 391 wallclock secs (362.40 usr + 0.51 sys = 362.91 CPU) @ 27.56/s (n=10000)
tr: 27 wallclock secs (25.32 usr + 0.03 sys = 25.35 CPU) @ 394.48/s (n=10000)
Grüße,
CK