Regulärer Ausdruck gesucht

Hi!

ich lese eine Zeile aus einer html-Datei ein. In dieser Zeile steckt ein SSI-Aufruf. Ich will mit einer RegEx die einzelnen Parameter herauskitzeln.

Der SSI-Aufruf lautet ungefähr so: exec cgi="/cgi-bin/script.pl?menu=irgendwas&bereich=irgendwas&titel=irgendwas"

die ersten beiden irgendwasse bekomme ich mit:

if ($line =~ /menu=(\w+)&/) {$parameter{‚menu‘} = $1;}
if ($line =~ /bereich=(\w+)&/) {$parameter{‚bereich‘} = $1;}

aber beim „titel“ beiss ich mir die Zähne aus. Für $1 wird da immer 0 (wenn überhaupt) ausgegeben :frowning: Es können im dritten „irgendwas“ alle möglichen (und bei SSI-Aufrufen erlaubten Sonder-) Zeichen vorkommen. Daher dachte ich, blöd wie ich bin, ich sollte mal folgendes probieren:

if ($line =~ /titel=(.)*" -->/) {$parameter{‚titel‘} = $1;}

danach habe ich noch alle Varianten ausprobiert die mir eingefallen sind, bin aber auf keinen grünen zweig gekommen :frowning:((((

Kann mir da jemand helfen? Wie muss die RegExpr. aussehen, damit ich meinen Ausdruck matchen kann?

ttl seas
regenfeld

probiere es mal so:

$line='blabla...exec cgi="/cgi-bin/script.pl?menu=irgendwas&bereich=irgendwas&titel=irgendwas"'."blabla\n"; #die Zeile 
$line=~m/.\*?\?(.\*?)".\*/g; #den parameterstring
$line=$1;
$line=~s/&/=/g; # &-Zeichen durch =-Zeichen erstzen
%params=split("=", $line);

print $params{"menu"};

cu, holli

Du bist ein Schatz :o)))

$line=~m/.*??(.*?)".*/g; #den parameterstring

… genau das habe ich gesucht! Mit split hatte ich es natürlich schon probiert, aber habs wieder augegeben, da ich einmal das ? dann das " dann das & und schliesslich noch das = als „Splitter“ genommen habe.

$line=~s/&/=/g; # &-Zeichen durch =-Zeichen erstzen

Das ist mir nicht ganz klar. Wieso umwandeln? mit den &'s kann man das zeugs ja schön in saubere Pärchen zerlegen. Wie beim Auswerten eines Formular-Query-strings.

Aber danke für die flotte Hilfe, klappt wunderbar jetzt :smile:))

ttl seas
regenfeld

$line=~s/&/=/g; # &-Zeichen durch =-Zeichen erstzen

Das ist mir nicht ganz klar. Wieso umwandeln? mit den &'s kann
man das zeugs ja schön in saubere Pärchen zerlegen. Wie beim
Auswerten eines Formular-Query-strings.

ganz einfach. wenn ich nur an den &-splitte erhalte ich ein Array mit name-werte strings (wie menu=irgendwas). Die müßte ich dann wieder extra trennen um sie in den hash zu schreiben.

Da in Perl ein hash auch nur eine liste ist (und man split nur einen trenner übergeben kann) ist es einfacher die Liste komplett zu splitten und dann dem Hash zuzuweisen.
Dazu muß man einen Trenner festlegen (hier =).

@array=(„arg1“, „val1“, „arg2“, „val2“); %hash=@array;

ist identisch mit

%hash=(„arg1“=>„val1“, „arg2“=>„val2“);
oder
%hash=(„arg1“, „val1“, „arg2“, „val2“);

trick
mit dem trick kann man auch wunderbar benannte funktionparameter realisieren.

wie z.b:

herkömmlich:
sub add\_new\_user {
 my $username=$\_[0];
 my $password=$\_[1];
 print $username;
 .....
}
#
&add\_new\_user ("holli", "werweisswas");
#
#
#trickreich:
sub add\_new\_user {
 my %args=@\_;
 print $args{"username"};
 .....
}
#
&add\_new\_user ("username"=\>"holli", "password"=\>"werweisswas");
#

bei funktionen mit vielen parametern führt das zu saubereren, lesbarerern und weniger fehleranfälligen (wie oft vergisst man die reihenfolge der parameter?) programmen.

cu, holli

Danke, toller Trick !!!
Hallo Markus!

@array=(„arg1“, „val1“, „arg2“, „val2“); %hash=@array;

ist identisch mit

%hash=(„arg1“=>„val1“, „arg2“=>„val2“);
oder
%hash=(„arg1“, „val1“, „arg2“, „val2“);

Also ich staune jedesmal wieder was dieses Perl alles kann :o)
Hatte nicht gedacht bzw. vergessen (jetzt erinnere ich mich wieder das mal wo gelesen zu haben) dass das mit den Hashes so einfach funktioniert.

Danke auch für deinen Trick mit der Parameterübergabe. In der Tat habe ich schon oft die Reihenfolge vergessen in der Parameter an eine Funktion übergeben werden. :wink:

Ich werde das gleich ab der nächsten Funktion einsetzen.

danke,
regenfeld