Uli Weber: Query-String-Übergabe unter Win32

Hallo Forum,

ich hänge z.Z. an einem Problem, das folgendermassen aussieht: Ich möchte aus mehreren Textdateien
HTML-Seiten erzeugen. Soweit, sogut: Das Öffnen des Textfiles, Zerschneiden der Dateiinhalte und
das Schreiben des HTML funktioniert, wenn ich die einzugebende Textdatei im Code eindeutig benenne.

Nun möchte ich aber verschiedene Textdateien mit diesem einen Script bearbeiten, und die Filenames
als Query übergeben. Wenn ich das per Kommandozeile versuche (perl d:/pfad/script.pl?name), kommt
ein "Can't open perl script "d:/pfad/script.pl?name": Invalid argument" zurück. Übergebe ich den Namen
in der Form "perl/pfad/script.pl name", wie im O'Reilly "Gecko-Book" beschrieben (unter "Rhombus-Operator"),
macht mein Script gar nichts. Das Auslesen des Query-Strings soll wie folgt geschehen:

$query_string = $ENV{"QUERY_STRING"};
chomp $query_string;
[...]
$text_file = "D:/pfad/$query_string.txt";       # Location Inputfile

usw.usf.

Leider habe ich z.Z. nur einen NT-Rechner zur Verfügung, auf dem ich testen kann ...
Woran kann das Problem liegen, bzw. wie kann ich den Query-String über die Kommandozeile übergeben?

Danke schonmal,
Uli

  1. Hallo Uli!

    Versuch mal den Aufruf

    perl d:/pfad/script.pl?name=name

    .. Vielleicht funzt's dann...

    Bis dann,
    Dennis

  2. Hi Uli!

    Mit $ENV{"QUERY_STRING"} greifst Du auf die Umgebungs-(Environment-)Variable QUERY_STRING zu. Damit es diese ueberhaupt gibt, muss man sie setzen. Wenn Du ein CGI-Script ueber HTTP aufrufst und wie gewohnt mit ? den Query-String angibst, macht das der Webserver fuer Dich. Du willst aber das Script ganz normal per Kommandozeile aufrufen (wenn ich das richtig geschnitten habe). Demnach *muesstest* Du

    set QUERY_STRING=filename
        perl d:/pfad/script.pl

    ausfuehren. Das ist aber ziemlich aufwendig und gerade unter NT auch ziemlich nervenaufreibend, sobald Du mal einen Parameter mit Leerzeichen uebergeben willst.

    Die vorgesehene Variante ist bestechend einfach: Gib das Argument normal auf der Kommandozeile an, also
        perl d:/pfad/script.pl filename
    (hast Du ja versucht), und lies dann dieses Argument auf dem vorgesehen Weg aus. Dazu gibt es in Perl das Array @ARGV, das die auf der Kommandozeile uebergebenen Argumente enthaelt. Der Dateiname steht dann also in $ARGV[0].

    So lange, Calocybe

    1. Moin Calocybe,

      erst mal ein dreifach donnerndes THX! ;-)
      Die Lösung über $ARGV klappt, wenn auch immer noch eine klitzekleine Unklarheit besteht:
      Wenn ich die Environment-Variable nach der ersten beschriebenen Methode händisch setze,
      scheint sie wohl resident zu sein, zumindest kann ich beim zweiten Script-Aufruf immer noch
      darauf zurückgreifen (Deshalb meintest Du wahrscheinlich "nervenaufreibend").
      Wie schaut das nach der zweiten Methode aus? Wenn ich nun KEINEN String übergebe, zählt
      das als KEIN oder als LEERER String (ein Leerstring sollte die Variable zurücksetzen, oder
      sehe ich das total falsch?)?

      Horrido, Uli

      1. Hi again

        Wenn ich die Environment-Variable nach der ersten beschriebenen Methode händisch setze,
        scheint sie wohl resident zu sein

        Ja. Die Umgebungsvariablen sind fuer diese Kommandozeilensitzung (und alle Child-Prozesse, also auch Dein Perl-Script) eben so da, das ist ja deren Sinn. Z.B. ist da auch die PATH-Variable und einige andere, die staendig benoetigt werden. Einfach set eingeben und Du bekommst die Liste. Wenn Du einen Wert loeschen willst, geht das mit
            set QUERY_STRING=

        zumindest kann ich beim zweiten Script-Aufruf immer noch
        darauf zurückgreifen (Deshalb meintest Du wahrscheinlich "nervenaufreibend").

        Nein, nervenaufreibend weil man z.B. den Wert unter manchen Umstaenden in Anfuehrungszeichen einschliessen muss, damit die Kommandozeile nicht irgendwelche Dinge in manche Zeichen hineininterpretiert (z.B. <>). Soweit ist das normal und ok, allerdings erdreistet sich Windows, diese Anfuehrungszeichen dann als Teil des Wertes zu betrachten, und das ist gar nicht so ok, denn die " will man ja eigentlich gar nicht haben.

        Wie schaut das nach der zweiten Methode aus?

        Die uebergebenen Argumente gelten natuerlich nur fuer den einen Aufruf. Nur dort sind sie verfuegbar und hinterher vergessen.

        Wenn ich nun KEINEN String übergebe, zählt
        das als KEIN oder als LEERER String (ein Leerstring sollte die Variable zurücksetzen, oder
        sehe ich das total falsch?)?

        Wenn Du nichts hinschreibst, wird auch nichts uebergeben und @ARGV ist leer (hat kein einziges Element). Wenn Du aber ungefaehr
            perl script.pl ""
        schreibst, dann uebergibst Du da ein Argument, das ein String der Laenge 0 ist.

        Horrido, Uli

        ... Joho! Bei den Jaegern gewesen?

        Solange