[GastForen Archiv Perl und CGI split

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Archiv - Archivierte Foren
Themen
Beiträge
Moderatoren
Letzter Beitrag

split

MoD
Beiträge gesamt: 16

9. Sep 2003, 19:18
Beitrag # 1 von 6
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hi Leute,

gibt es eine Möglichkeit diesen Code zu vereinfachen ?

$eintrag = $ENV{'QUERY_STRING'};
@eintrag = split(/&/,$eintrag);
foreach(@eintrag)
{
($i, $a) = split(/=/, $eintrag[$_]);
$eintraege[$i] = $a;
}

Mein Problem: $eintrag enthält name=wert Kombis, welche verarbeitet werden. Dazu brauche ich aber $i und $a, was mich stört.

Ist es möglich auf ein ganz bestimmtes Element von der Liste, die Split wiedergibt zuzugeifen, sodass ich schreiben kann:

$eintraege[eintrag in spit] = eintrag in split 2; -> direkter Zugriff auf die Splitwerte

Ich möchte mir den Umweg über die Transvervariablen ersparen.

Danke für Eure Antworten

MoD
X

split

oesi50
  
Beiträge gesamt: 2315

18. Sep 2003, 11:57
Beitrag # 2 von 6
Beitrag ID: #51234
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
hi Mod,

$a und $b sind schon in Perl vordefiniert.
Verwende diese Variablen nur, wenn Du sie tatsächlich benötigst( z.B. bei der Sortierung).

Durch my sind Variablen nur innerhalb eines Anweisungsblockes gültig.
Am Ende des Blockes {} werden sie wieder verworfen und benötigen keinen Speicher mehr.

Besser ist es auch, die Wertpaare in einem Hash zu speichern, damit ist man unabhängig von irgend einer Reihenfolge und ein Direktzugriff ist auch möglich.

Die Kurzversion könnte dann so aussehen:
for ( split(/&/, $ENV{'QUERY_STRING'}) ){
my ($k, $v) = split(/=/);
$eintraege{$k} = $v;
}

Der Zugriff erfolgt dann so:

print $eintraege{'dein_key'};

Vor der Verwendung der übergebenen Werte solltest Du sie natürlich noch auf Gültigkeit überprüfen.
Wenn nicht, hast Du mit sehr hoher Wahrscheinlichkeit ein Sicherheitsproblem.

-> Usereingaben NIEMALS ungeprüft verarbeiten <-

Grüße Oesi


als Antwort auf: [#50330]
(Dieser Beitrag wurde von oesi50 am 18. Sep 2003, 12:02 geändert)

split

MoD
Beiträge gesamt: 16

18. Sep 2003, 18:04
Beitrag # 3 von 6
Beitrag ID: #51314
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
@Oesi

for ( split(/&/, $ENV{'QUERY_STRING'})) Hm geht for hier einfach
jedes Element durch ? Wäre foreach hier nicht besser angebracht

{
my ($k, $v) = split(/=/); was splitet split() hier genau ? $_ ?
$eintraege{$k} = $v; das iss mir klar
}

MoD


als Antwort auf: [#50330]

split

oesi50
  
Beiträge gesamt: 2315

18. Sep 2003, 18:14
Beitrag # 4 von 6
Beitrag ID: #51315
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
ja, for geht jedes Element durch, das befindet sich dann jeweils in $_
ja, split splittet dann $_

Grüße Oesi


als Antwort auf: [#50330]
(Dieser Beitrag wurde von oesi50 am 18. Sep 2003, 18:17 geändert)

split

MoD
Beiträge gesamt: 16

18. Sep 2003, 19:51
Beitrag # 5 von 6
Beitrag ID: #51321
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
@Oesi

for ( split(/&/, $ENV{'QUERY_STRING'}))
@
{
my ($k, $v) = split(/=/);
$eintraege{$k} = $v;
}

Da ist Perl ja sehr schlacksig.

Bei anderen Prog-Sprachen hätte ich schon bei for einen Syntaxfehler erhalten.
Einfach so for ohne Start und Endpunkt der Schleife.

Splitet split also $_ automatisch oder wolltest du dir nur die Schreibarbeit ersparen?

Perl ist zwar effektiv, aber auch sehr sehr gewöhnungsbedürftig.


als Antwort auf: [#50330]

split

oesi50
  
Beiträge gesamt: 2315

18. Sep 2003, 21:47
Beitrag # 6 von 6
Beitrag ID: #51331
Bewertung:
(1702 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
foreach ist ein Überbleibsel von Perl4 und wird nur aus Kompatibilitätsgründen unterstützt.
Du solltest deshalb immer for verwenden.

Anfang und Ende wird durch { und } dargestellt.
Wenn jedoch die Abbruchbedingung gemeint ist, dann ist die dann erfüllt, wenn alle Elemente des angegeben Ausdruckes bearbeitet wurden.

Die meisten Funktionen verwenden $_ wenn nichts angegeben wird.

Ich finde Perl genial.

Grüße Oesi


als Antwort auf: [#50330]
(Dieser Beitrag wurde von oesi50 am 18. Sep 2003, 21:49 geändert)
X