SektOderSelters: Perl Skript zum Erstellen von ZIP's - Probleme

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

  1. 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

    --
    Nichts ist schwerer einzureißen als die Mauer in den Köpfen.
    1. Hi Siechfred

      $text =~ s/\//g;

      klasse danke ;-)!

    2. 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

      --
      Das Leben ist wie ein Kartenspiel: was dir gegeben wurde, ist vorbestimmt. Doch wie du damit spielst, ist deine Entscheidung.
      http://wwwtech.de/