hilfdirselbst.ch
Facebook Twitter gamper-media

"Geht nicht" ist keine gültige Fehlermeldung!

MoD
Beiträge: 16
9. Sep 2003, 19:18
Beitrag #1 von 6
Bewertung:
(1347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

split


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 Top
 
X
oesi50  A  S
Beiträge: 2315
18. Sep 2003, 11:57
Beitrag #2 von 6
Beitrag ID: #51234
Bewertung:
(1347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

split


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)
Top
 
MoD
Beiträge: 16
18. Sep 2003, 18:04
Beitrag #3 von 6
Beitrag ID: #51314
Bewertung:
(1347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

split


@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] Top
 
oesi50  A  S
Beiträge: 2315
18. Sep 2003, 18:14
Beitrag #4 von 6
Beitrag ID: #51315
Bewertung:
(1347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

split


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)
Top
 
MoD
Beiträge: 16
18. Sep 2003, 19:51
Beitrag #5 von 6
Beitrag ID: #51321
Bewertung:
(1347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

split


@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] Top
 
oesi50  A  S
Beiträge: 2315
18. Sep 2003, 21:47
Beitrag #6 von 6
Beitrag ID: #51331
Bewertung:
(1347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

split


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)
Top
 
X