Supportnet / Forum / Skripte(PHP,ASP,Perl...)
Probleme mit $/ und STDIN
Frage
Ich bin Anfänger in Perl und während meiner ersten Schritte stellte sich ein Problem welches ich mir nicht erklären kann. Vieleicht kann mir einer von Euch helfen.
Zum Problem:
Nachfolgende findet Ihr den Sourcecode.
1 #!/usr/local/bin/perl -w
2
3 $i=0;
4 open(TEST,"grep A6 ./Tab1.txt |");
5 #print <TEST>;
6
7 $/='\n';
8 foreach $x (<TEST>) {$A[$i++]=$x}
9 close(TEST);
10 $b = @A;
11 print "$b\n";
12 foreach $x (@A) {print "$x\n"}
13
14 print "Name:";
15 $name = <STDIN>;
16 chomp($name);
17 printf("Hallo, %s !\n", $name);
Das Problem hängt mit Zeile 7 zusammen. In der Form wie der Code dargestellt ist, läßt sich die Eingabe in Zeile 15 nur mit Ctlr-C abbrechen und die Ausgabe in Zeile 12 erfolgt mit einer zusätzlichen Leerzeile.
Wird Zeile 7 auskommentiert, so endet die Eingabe (Zeile 15) mit RETURN und die Ausgabe (Zeile 12) erfolgt ohne zusätzliche Leerzeile.
Dieses Verhalten kann ich mir nicht erklären.
Für eine Antwort wäre ich dankbar.
Vielen Dank
Detlef
Antwort 1 von semi
Steuerzeichen wie \n \t usw. werden nur innerhalb von Zeichenketten interpretiert.
Betrachte dazu zuerst folgendes Beispiel:
Wenn Du es ausführst, dann wirst Du merken, dass es einen großen Unterschied zwischen "\n" und '\n' gibt. (einfaches und doppeltes Anführungszeichen)
Beachte insbesondere die Länge und die Ausgabe der Variablen $a und $b.
'\n' wird als eine Folge der Zeichen \ und n interpretiert. "\n", wie erwartet, als Zeilenumbruch.
Standardmäßg ist die Variable $/ mit "\n" vorbelegt
Versuche mal in Deinem Beispiel folgendes als Namen einzugeben:
abc\n
und zwar exakt, wie es hier steht.
Mit \n meine ich nicht Zeilenumbruch sondern die Zeichen \ und n hintereinander.
Klartext:
"\n" ist Zeichenkette nur mit Zeilenumbruch
'\n' Zeichenfolge bestehend aus \ und n
Gruß,
Michael
Betrachte dazu zuerst folgendes Beispiel:
#!/usr/local/bin/perl -w
print "length(\$\/) = " . length($/) . "\n";
print "length(\"\\n\") = " . length("\n") . "\n";
print "length(\'\\n\') = " . length('\n') . "\n";
if($/ eq "\n") {
print "\$\/ und \"\\n\" sind gleich.\n";
}
$a = '\n';
$b = "\n";
print "a = \"" . $a . "\"\n";
print "b = \"" . $b . "\"\n";
Wenn Du es ausführst, dann wirst Du merken, dass es einen großen Unterschied zwischen "\n" und '\n' gibt. (einfaches und doppeltes Anführungszeichen)
Beachte insbesondere die Länge und die Ausgabe der Variablen $a und $b.
'\n' wird als eine Folge der Zeichen \ und n interpretiert. "\n", wie erwartet, als Zeilenumbruch.
Standardmäßg ist die Variable $/ mit "\n" vorbelegt
Versuche mal in Deinem Beispiel folgendes als Namen einzugeben:
abc\n
und zwar exakt, wie es hier steht.
Mit \n meine ich nicht Zeilenumbruch sondern die Zeichen \ und n hintereinander.
Klartext:
"\n" ist Zeichenkette nur mit Zeilenumbruch
'\n' Zeichenfolge bestehend aus \ und n
Gruß,
Michael
Antwort 2 von dss
Hallo Michael,
vielen Dank für Deine prompte Antwort. Bei genauerem Hinsehen hätte ich es eigentlich selbst finden sollen.
Du hast mir aber noch mal klar gemacht den Unterschied zwischen „“ und ‚’.
Vielen Dank noch mal
Detlef
vielen Dank für Deine prompte Antwort. Bei genauerem Hinsehen hätte ich es eigentlich selbst finden sollen.
Du hast mir aber noch mal klar gemacht den Unterschied zwischen „“ und ‚’.
Vielen Dank noch mal
Detlef

