Nochmal Perl (aber dringend)
Nico
Hallo liebe Surferinnen und Surfer!
Ich habe noch einmal eine Frage zu Perl:
Ich will Daten, die in einer DAT-Datei gespeichert sind, zusammenhängend aufführen. OK, das ist eine etwas doofe Erklärung, aber vielleicht versteht man es ja, wenn man den Teil des Sourcecodes sieht, den ich dafür evtl. verwenden wollte, der aber nicht klappt:
open(DAT,"dat.dat");
@dat = <DAT>;
close(DAT);
for(@dat)
{
($nick, $pwd, $email, $hp) = split(/;/, $_);
if($Formular{'nick'} eq $nick)
{
print "<ul>\n<li>$email</li>\n<li>$hp</li>\n</ul>\n";
}
}
Ich weiß auch in etwa, warum das nicht funktionieren kann, aber ich suche ine Lösung, mit der es Funktionieren kann.
Gibt es z.B. etwas, dass die Bedingung so darstellt:
"sobald"($Formular{'nick'} eq $nick)
oder muss ich es ganz anders darstellen?
Auf bald dann...
open(DAT,"dat.dat");
open(DAT,"<dat.dat");
@dat = <DAT>;
close(DAT);
while(<DAT>){
push(@dat,$_);
}
close(DAT);
for(@dat){
»» ($nick, $pwd, $email, $hp) = split(/;/, $_);
»» if($Formular{'nick'} eq $nick)
ich weiss nicht , was $Formular{'nick'} bei dir bedeutet, aber du hast hoffentlich die Formulardaten richtig eingelesen?
»» {
»» print "<ul>\n<li>$email</li>\n<li>$hp</li>\n</ul>\n";
»» }
}
Sonst ist mir jetzt erstmal nichts aufgefallen.
hi!
@dat = <DAT>;
while(<DAT>){
push(@dat,$_);
}
Warum das? <DAT> liefert in einem Listenkontext alle Zeilen von DAT zurück, im skalaren Kontext nur die jeweils nächste Zeile
bye, Frank!
Hi Thomas!
while(<DAT>){
push(@dat,$_);
}
close(DAT);
Welcher Wert würde hier denn an @dat angehängt werden? Mit diesen Sonderskalaren komm ich noch nicht so zurecht...
ich weiss nicht , was $Formular{'nick'} bei dir bedeutet, aber du hast hoffentlich die Formulardaten richtig eingelesen?
Ich hab ca. so gemacht, dass anstatt dem bei SelfHTML vorgestellten
$Formular[$i] = $name;
...
$Formular[$i] = $value;
ich folgendes verwndet habe:
$Formular{$name} = $value;
Also das der Name des Eingabefeldes direkt angesprochen wird, anstatt dass das Formular in einer Reihenfolge stehen muss.
Na ja, trotzdem danke für deine Antwort. Aber auf die oben gestellte Frage wüsste ich doch gern die Antwort.
Bye, Nico!
while(<DAT>){
push(@dat,$_);
}
close(DAT);
Wenn im Programm nichts anderes angegeben wurde, arbeitet PERL mit den Defaultwerten (Skalar) $_ und (Array) @_ .
In diesem Fall wird die erste Zeile der mit 'DAT' geöffneten Datei in $_ eingelesen und anschließend hinten an den Array @dat angehängt, danach erfolgt dasselbe mit der zweiten
Zeile, usw. bis die Datei keine Zeilen mehr hat. Dann kommt 'undef' als Wert zurück und die while-Schleife bricht ab.
Viele Gruesse
Cosmo
open(DAT,"dat.dat");
@dat = <DAT>;
close(DAT);
Das einlesen sämtlicher Zeilen in ein Array ist soweit völlig in Ordnung ...
for(@dat)
Hier hast Du Dich allerdings in der Anweisung vergriffen. Richtig wäre hier
foreach $zeile (@dat)
{
($nick, $pwd, $email, $hp) = split(/;/, $zeile);
[...]
}
Ich weiß auch in etwa, warum das nicht funktionieren kann, aber ich suche ine Lösung, mit der es Funktionieren kann.
Warum gibst Du denn dann nicht preis, wo Deiner Meinung nach der Fehler liegt. Offensichtlich
setzt Du dieses Programm ja im Rahmen eines HTML-Formulares ein. Je mehr Informationen
Du zu Deinem Problem mit angibst, desto eher kann die hier auch eine "konkrete" Lösung
bzw. ein enstprechender Lösungsweg präsentiert werden ...
Gibt es z.B. etwas, dass die Bedingung so darstellt:
"sobald"($Formular{'nick'} eq $nick)oder muss ich es ganz anders darstellen?
Diesen Teil Deiner Frage verstehe ich leider nicht! Das if-statement aus dem Beispiel wirkt
eigentlich ganz passend eingesetzt. Aber möglicherweise möchtest Du ja nebenbei noch etwas
anderes erreichen ???
Jörk
Hallo liebe Surferinnen und Surfer!
open(DAT,"dat.dat");
@dat = <DAT>;
close(DAT);
»»
Soweit alles richtig (Dateizugriffssymbol nicht vergessen); Du solltest aber immer Fehlerroutinen
schreiben um zu sehen, ob Dein Programm einen Fehler hat oder der Verzeichnispfad nicht stimmt
open (DAT, "<dat.dat") || die "Text";
for(@dat)
muss foreach (@dat) heissen
{
»» ($nick, $pwd, $email, $hp) = split(/;/, $_);
»» if($Formular{'nick'} eq $nick)
ist formal richtig, wenn Du wirklich den Wert im Hash 'Formular' mit dem Schlüssel
'nick' mit der Variablen nick vergleichen willst
Andere Ausdrucksmöglichkeiten:
1.) print "...." if ($Formular{'nick'} eq $nick);
2.) ($Formular{'nick'} eq $nick) && print "...";
»» {
»» print "<ul>\n<li>$email</li>\n<li>$hp</li>\n</ul>\n";
»» }
}
Auf bald dann...
Logo, gib kurze Nachricht wenn das Problem gelöst ist !!
Viele Gruesse an alle PERL-Verrückten und Programmierer !!
Cosmo
hi!
for(@dat)
muss foreach (@dat) heissen
Nein, er verwendet genau die richtige Anweisung. Man _kann_ es so schreiben wie du.
bye, Frank!
Hi Cosmo!
Soweit alles richtig (Dateizugriffssymbol nicht vergessen); Du solltest aber immer Fehlerroutinen
schreiben um zu sehen, ob Dein Programm einen Fehler hat oder der Verzeichnispfad nicht stimmt
open (DAT, "<dat.dat") || die "Text";
Das ist aber nicht mein Problem. Die Datei ist zugriffsfähig, denn daraus werden schon andere Daten im Skript eingelesen, nur dieser Teil kappte nicht.
»»
for(@dat)
muss foreach (@dat) heissen
Wieso denn? Ich denke, foreach hat nur einen Sinn, wenn so etwas angegeben wird:
foreach $einzel (@dat)?
ist formal richtig, wenn Du wirklich den Wert im Hash 'Formular' mit dem Schlüssel
'nick' mit der Variablen nick vergleichen willst
In der in SelfHTML vorgestellten foreach-Schleife zum Sonderzeichen Entfernen der hexadezimalen Angaben und umwandeln in Sonderzeichen habe ich statt $Formular[$i]...
einfach $Formular{$name} = $value; eingesetzt. Hat den Vorteil, dass amn das Formular nicht in eine bestimmte Reihenfolge setzen muss.
Andere Ausdrucksmöglichkeiten:
1.) print "...." if ($Formular{'nick'} eq $nick);
2.) ($Formular{'nick'} eq $nick) && print "...";
Was bewirkt das jeweils?
Logo, gib kurze Nachricht wenn das Problem gelöst ist !!
Werd ich tun.
Bye, Nico!
hi!
for(@dat)
muss foreach (@dat) heissen
Wieso denn? Ich denke, foreach hat nur einen Sinn, wenn so etwas angegeben wird:
foreach $einzel (@dat)?
Nicht ganz. Genau genommen ist "foreach" lediglich ein Synonym für "for". Es ist also vollkommen egal, welches der beiden du verwendest.
Andere Ausdrucksmöglichkeiten:
1.) print "...." if ($Formular{'nick'} eq $nick);
2.) ($Formular{'nick'} eq $nick) && print "...";
Was bewirkt das jeweils?
Es macht genau das gleiche wie deine Möglichkeit und ist dabei unübersichtlicher.
bye, Frank!
Hallo liebe Surferinnen und Surfer!
Ich habe noch einmal eine Frage zu Perl:
Ich will Daten, die in einer DAT-Datei gespeichert sind, zusammenhängend aufführen. OK,
das ist eine etwas doofe Erklärung, aber vielleicht versteht man es ja, wenn man den Teil
des Sourcecodes sieht, den ich dafür evtl. verwenden wollte, der aber nicht klappt:open(DAT,"dat.dat");
@dat = <DAT>;
close(DAT);for(@dat)
{
»» ($nick, $pwd, $email, $hp) = split(/;/, $_);
»» if($Formular{'nick'} eq $nick)
»» {
»» print "<ul>\n<li>$email</li>\n<li>$hp</li>\n</ul>\n";
»» }
}
Ich weiß auch in etwa, warum das nicht funktionieren kann, aber ich suche ine Lösung, mit
der es Funktionieren kann.
Gibt es z.B. etwas, dass die Bedingung so darstellt:
"sobald"($Formular{'nick'} eq $nick)oder muss ich es ganz anders darstellen?
Auf bald dann...
Wenn ich es richtig verstehe, hast Du in der *.dat für jeden User eine Zeile und suchst nun nach dem User "nick" um seine E-Mail Adresse auszugeben. Ich würde die gesamte Datei mit einem foreach durchforsten, etwa so:
foreach $dat(@dat)
{
if ($dat =~ /nick/)
{
print "Habe "nick" in $dat gefunden!";
}
}
In $dat steht dann die korrekte Zeile, und die kannst Du dann ja noch einer weiteren Behandlung unterziehen - also z.B. das splitting.
Schick mal 'ne Mail, ob es funktioniert.
Heribert