Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11407[/thread]

\n aus files wird nicht als newline behandelt



<< >> 9 Einträge, 1 Seite
DanielH
 2008-03-04 16:40
#106632 #106632
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Hallo,

kann mir jemand sagen, was ich in eine file schreiben muss damit \n und \r von Perl auch als solche erkannt werden? Wenn ich \r\n schreibe wird das Ganze nur als normaler string behandelt.
GwenDragon
 2008-03-04 16:42
#106633 #106633
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Du musst das in Ahnführungszeichen setzen, sonst eird es nicht als Zeichencode gewertet.
"\n" ist Newline und "\x0A" also Hex 0A oder Ctrl M
"\r" ist Return = "\x0D", also Hex 0D oder Ctrl J

Was meinst du mit erkennen?
BratHering
 2008-03-04 16:42
#106634 #106634
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Hast du \n bzw. \r in Single Quotes oder Double Quotes gesetzt? - Hast du die Datei im Text oder Binär Modus geöffnet?
DanielH
 2008-03-04 17:49
#106637 #106637
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Danke für die schnelle Antwort GwenDragon und BratHering.

@ GwenDragon:

wenn ich das \n in Anführungszeichen schreibe oder als \x0A wird es als "\n" oder \x0A ausgegeben, wenn ich den Text aus der Datei ausgebe.


@ BratHering:

\n oder \r hab ich mit "", mit '' und ohne Anführungszeichen getestet (hat alles nicht funktioniert).

Ich öffne die file ganz normal mit open(), keine Ahnung welcher Modus das ist.


In der file, die ich einlese, steht z. B. sowas:
GET www.ebay.de/ HTTP/1.0\r\nUser-Agent: Opera/9.25 (X11; Linux i686; U; en)\r\nHost: www.ebay.de\r\nAccept: text/html\r\nAccept-Language: de-DE,de;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nProxy-Connection: close\r\n\r\n

Wenn den Text jetzt per open() einlese und ausgebe, wird der Text so anzeigt, wie er ist (also mit \n statt einer neuen Zeile).

Wenn ich den gleichen Text jetzt direkt in meinem Skript einer Variable zuweise, und diese ausgebe sieht es so aus:


GET www.ebay.de/ HTTP/1.0
User-Agent: Opera/9.25 (X11; Linux i686; U; en)
Host: www.ebay.de
Accept: text/html
Accept-Language: de-DE,de;q=0.9,en;q=0.8
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Proxy-Connection: close


\n & \r wurden also als newline & return erkannt bzw. aufgelöst.

Ich hab bisher folgenden versucht:
[...]/ HTTP/1.0"\r""\n"User-Agen[...] # mit ""
[...]/ HTTP/1.0'\r''\n'User-Agen[...] # mit ''
[...]/ HTTP/1.0"\x0D""\x0A"User-Agen[...] # in Hex + ""
[...]/ HTTP/1.0\x0D\x0AUser-Agen[...] # in Hex
GwenDragon
 2008-03-04 18:01
#106639 #106639
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Kannst du uns sagen wie du an die Daten kommst, um die es geht?
Und wie ist dein Skript, welches etwas ausgibt?
DanielH
 2008-03-04 18:20
#106641 #106641
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Die Daten hab ich "per Hand" in eine file auf meinem (Linux-)Rechner geschrieben, auf dem auch das Skript läuft. edit: die Daten selbst kommen aus dem Netzwerk-Sniffer Wireshark /edit.

Das Skript, mit dem ich das Ganze teste sieht so aus (Ausschnitt):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
        open IN, "<$input_file" or die_now("Die Input-File konnte nicht eingelesen werden: $!");;
                $versendete_Requests = @Requests = split "\n%%%", do { local $/; <IN> };
        close IN;

        for (@Requests){
                print "\n\n", $_, "\n\n";
                ($Request, $Parameter) = split "\n&&&", $_;
                $Request = "$Request";
                print "\n\n", $Request, "\n\n";
                print "\n\n", $Parameter, "\n\n";
                $Request = "GET www.ebay.de/ HTTP/1.0\r\nUser-Agent: Opera/9.25 (X11; Linux i686; U; en)\r\nHost: www.ebay.de\r\nAccept: text/html\r\nAccept-Language: de-DE,de;q=0.9,en;q=0.8\r\nAccept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1\r\nProxy-Connection: close\r\n\r\n";
                print "\n\n", $Request, "\n\n";
        }


In der File können mehrere HTTP requests sein, welchen optional Parameter zugewiesen werden können. Deshalb die splits mit "\n&&&" und "\n&&&".
DanielH
 2008-03-05 02:07
#106670 #106670
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Juhu, ich habs endlich hinbekommen :)

Allerdings klappt es nur mit einem workaround:

@Requests = split "\n___", do $input_file;

Wenn der Inhalt der file in Anführungszeichen steht kann man ihn einfach per do einer Variable/Funktion übergeben.

Steuerzeichen werden so als solche erkannt.

PS: wegen so'nem Misst hab ich jetzt den ganzen Tag rumgemacht :(
Dubu
 2008-03-05 17:40
#106723 #106723
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Die Zeichen \n, \r etc. haben nur dann eine besondere Bedeutung, wenn sie in doppelten Anführungszeichen (oder einem vergleichbaren Quoting) im Quellcode des Programms stehen. Die Zeichenfolge "\n" in einer Datei ist einfach nur "Backslash gefolgt von n", nichts anderes.

Das ist übrigens in anderen Programmiersprachen wie C, C++ oder Java genauso.

Wenn du ein wörtliches "\n" in einer Datei in das interne \n von Perl (das Zeichen mit dem ASCII-Code 10) umwandeln möchtest, kannst du es ersetzen:
Code (perl): (dl )
$text =~ s/\\n/\n/g;

oder exakter (10 dezimal == 012 oktal):
Code (perl): (dl )
$text =~ s/\\n/\012/g;

Bedenke aber, dass ein \n beim Lesen oder Schreiben von Textdateien je nach Plattform umgewandelt wird, siehe perlport#Newlines.
DanielH
 2008-03-05 19:36
#106735 #106735
User since
2007-11-15
54 Artikel
BenutzerIn
[default_avatar]
Danke Dubu.

Mal überlegen, was ich jetzt am besten verwende...
<< >> 9 Einträge, 1 Seite



View all threads created 2008-03-04 16:40.