URL lokal mit CGI.pm parsen
Margin-Auto
- perl
0 Siechfred0 Margin-Auto0 Beat
0 Beat0 LanX-
Hi,
ich möchte in einem Skript, das bei mir lokal läuft (also nicht in einer CGI-Umgebung) eine URL parsen, damit ich die übergebenen Argumente herausbekomme. Geht das mit CGI.pm? Wenn ja, wie? Wie kann ich die URL übergeben?
TIA
Margin-Auto
ich möchte in einem Skript, das bei mir lokal läuft (also nicht in einer CGI-Umgebung) eine URL parsen, damit ich die übergebenen Argumente herausbekomme. Geht das mit CGI.pm?
Ich denke nein, denn CGI.pm setzt hier voraus, dass die entsprechenden CGI-Umgebungsvariablen gesetzt wurden, was bei Konsolenanwendungen nicht der Fall wäre.
Eventuell hilft Dir aber URI::ParseSearchString weiter.
Siechfred
Hi,
Eventuell hilft Dir aber URI::ParseSearchString weiter.
Danke für den Hinweis, aber das ist mir zu speziell. Ich suche keine Suchanfragen sondern Voutube-Video-IDs. Also der v-Parameter in den URLs. Habe es jetzt quick&dirty über eine Regex gelöst.
$ARGV[0]=~m/v=(.*)&?/i;
$videoid=$1;
Margin-Auto
Habe es jetzt quick&dirty über eine Regex gelöst.
$ARGV[0]=~m/v=(.*)&?/i;
$videoid=$1;
>
> Margin-Auto
m/v=(.\*)&?/i
wird mehr als die id matchen, sondern weitere Optionen.
"v=1&b=2&" =~ m/v=(.\*)&?/i and print $1, "\n";
Einen Querystring sollte man vorher angemessen behandeln, damit du nicht ein bösses Wunder erlebst, falls Youtube plötzlich den & Separator durch einen ; Separator ersetzt.
mfg Beat
--
Woran ich arbeite:
[X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)
><o(((°> ><o(((°>
<°)))o>< ><o(((°>o
ich möchte in einem Skript, das bei mir lokal läuft (also nicht in einer CGI-Umgebung) eine URL parsen, damit ich die übergebenen Argumente herausbekomme. Geht das mit CGI.pm? Wenn ja, wie? Wie kann ich die URL übergeben?
TIA
Margin-Auto
Query String zu parsen hat einen ähnlichen Schritt wie CGI Input zu parsen.
Hier nur ein Ausschnitt aus dem Fussmarsch.
#!C:/Programme/Perl/bin/perl.exe -w
#
#use strict;
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>error.txt") or die "Unable to append to error.txt: $!\n";
carpout(*LOG);
}
# eine test url
my $url="http:www.example.org/some/path/to.file?par1=A&par1=B&par2=C";
my $query = '';
$url =~ /\?(.*?)(?:#|$)/ and $query = $1;
# wir brauchen einen hash, in welchem wir Daten sammeln:
my %Input = ();
# $query soll gesplittet werden
foreach( split /[&;]/, $query ){
my ($par, $val) = (split /=/, $_, 2);
for($val){
tr/+/ /;
s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
s/\0//g; # enferne \0
s/\cM//g; # entferne \r
}
# Jetzt wird es knifflig:
# Der Simpel würde sagen:
# $Input{$par} = $val;
# was jedoch die Üertragung gleichnamiger Checkboxen verunmöglicht.
# statt dessen bauen wir einen Hash_of_Arrays
# wir müssen erst testen ob der key existiert,
unless( exists $Input{$par} ){
#um einen neuen anonymen Array zu erzeugen
$Input{$par} = [];
}
# an welchen wir nun $val pushen
push @{ $Input{$par} }, $val;
# zugegebenermassen, eine etwas heavy Syntax.
# und immer noch Quick-and-Dirty
}
# Access:
print $Input{par1}[0], "\n";
print $Input{par1}[1], "\n";
print $Input{par2}[0], "\n";
print "\nAll Input Is Evil\n";
sleep(10);
mfg Beat;
Bin mir ziemlich sicher das CGI.pm sowas zwecks Debugging von Haus aus unterstützt, schon mal in die perldoc geschaut?
... ah ja schau mal, ginge auch so! http://board.perl-community.de/thread/12784/startWithMessage=0
UPDATE: Nach Threaddurchsicht verstehe ich deine Frage besser, CGI.pm wär ziemlicher overkill, wähle lieber ein spezialisiertes Modul: http://search.cpan.org/search?query=URI&mode=all