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

chomp nicht nur für ein \n sondern unendlich viele (Seite 2)



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
renee
 2006-03-30 00:36
#63989 #63989
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Und was stimmt nicht an esskars Aussage?

esskar hat seinen Code als "richtiger" bezeichnet, weil er ein "Mehrzeilenäquivalent" zu chomp geschrieben hat, was man anhand des Threadtitels ok ist.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Dubu
 2006-03-30 00:56
#63990 #63990
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=sid burn,29.03.2006, 22:08]So Soll unter MacPerl ein "\n" == "\015" bedeuten. Bei DOS-basierten Perl Versionen ist "\n" == "\015\012", und bei Unix ist "\n" traditionell "\012". Ein Zeichen mehrere Bedeutungen.[/quote]
Wenn schon, denn schon.

Intern ist "\n" sowohl unter DOS/Windows als auch unter Linux/Unix "\012". Erst beim Lesen und Schreiben von Text(!)dateien wird unter DOS/Windows von der bzw. in die plattformübliche Form "\015\012" umgewandelt.

Ich habe leider keinen Mac, aber mich würde schon interessieren, ob man bei Apple mit dem Umstieg auf MacOS X und damit ein Unix-basiertes System auch von <CR> als Zeilentrenner auf <LF> umgestellt hat - und was ein aktuelles Perl auf dem Mac (im Vergleich zu "MacPerl") intern aus "\n" macht.
sid burn
 2006-03-30 01:09
#63991 #63991
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=renee,29.Mar..2006, 22:36]Und was stimmt nicht an esskars Aussage?

esskar hat seinen Code als "richtiger" bezeichnet, weil er ein "Mehrzeilenäquivalent" zu chomp geschrieben hat, was man anhand des Threadtitels ok ist.[/quote]
Er sagte das sein Programm mit der Verwendung "$/" richtiger sei als wenn man "\n" verwendet.

Ich persönlich denke das er darauf abzielen möchte, das die unterschiedlichen Systeme andere Zeichen Benutzen um einen Zeilenvorschub darzustellen.

Windows z.B. "\r\n" anstatt lediglich nur ein "\n". Da aber "\n" in Perl auch Systembedingt ist, und unter Windows das "\n" halt "\r\n" bedeutet, dürfte es doch so ziemlich egal sein ob nun $/ oder \n verwendet wird. Beides dürfte gleich Portabel sein, und ich denke keins von beiden ist richtiger, sondern beides ist gleich richtig.

Nun halt meine Frage ob dies wirklich so ist. All zu lange Programmiere ich noch nicht in Perl, und ich sehe aus meinen Blickwinkel durch die Portabilität von "\n" nicht, wieso dessen verwendung falsch sein sollte.


Quote
Intern ist "\n" sowohl unter DOS/Windows als auch unter Linux/Unix "\012". Erst beim Lesen und Schreiben von Text(!)dateien

Hmm,
okay das würde einiges erklären, aber bist du dir da sicher?

Im Kamel Buch wird ja extra als Beispiel die Socket Programmierung heran gezogen, und dort schreibe ich ja nicht in text Dateien. Und dort wird auch extra darauf hingewiesen das die Verwendung von "\n" vermieden werden soll, und lieber "\012" verwendet werden soll.\n\n

<!--EDIT|sid burn|1143666748-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-03-30 01:23
#63992 #63992
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Esskar hat das Verhalten von chomp "imitiert". chomp benutzt auch $/ zum Entfernen. Das hat mit den Unterschiedlichen Bedeutungen von "\n" nur bedingt etwas zu tun. In $/ kann auch etwas ganz anderes stehen. Vergleiche mal:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my $file = 'test.txt';

{
local $/ = "\n>"; # eignet sich gut bei FASTA-Sequenzen
open(my $fh,"<",$file) or die $!;
while(my $line = <$fh>){
print "LINE: $line LINEEND\n";
chomp $line;
print "LINE: $line LINEEND\n";
}
close $fh;
}


test.txt:
Code: (dl )
1
2
3
4
5
6
>Seq1
ABAAGGTURS
>Seq2
ANOTHERSEQUENCE
>Seq3
THIRDSEQUENCE
\n\n

<!--EDIT|renee|1143667492-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
sid burn
 2006-03-30 01:44
#63993 #63993
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=renee,29.Mar..2006, 23:23]Esskar hat das Verhalten von chomp "imitiert". chomp benutzt auch $/ zum Entfernen. Das hat mit den Unterschiedlichen Bedeutungen von "\n" nur bedingt etwas zu tun.[/quote]
Stimmt, da hätte ich eigentlich auch selber drauf kommen können das $/ etwas anderes enthalten kann, auser den unterschiedlichen Newline Sequenzen.

Danke, wieder etwas schlauer. :)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
esskar
 2006-03-30 01:54
#63994 #63994
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=sid burn,29.03.2006, 23:09]Er sagte das sein Programm mit der Verwendung "$/" richtiger sei als wenn man "\n" verwendet.

Ich persönlich denke das er darauf abzielen möchte, das die unterschiedlichen Systeme andere Zeichen Benutzen um einen Zeilenvorschub darzustellen.

Windows z.B. "\r\n" anstatt lediglich nur ein "\n". Da aber "\n" in Perl auch Systembedingt ist, und unter Windows das "\n" halt "\r\n" bedeutet, dürfte es doch so ziemlich egal sein ob nun $/ oder \n verwendet wird. Beides dürfte gleich Portabel sein, und ich denke keins von beiden ist richtiger, sondern beides ist gleich richtig.[/quote]
hätte ich auf \r\n vs \n geziehlt hätt ich wohl folgendes gemacht
Code: (dl )
$data =~ s{[\r\n]+$}{};


denn die Preisfrage an dich ist nämlich, was passiert, wenn du unter linux eine Dattei als Textdatei öffnest, die \r\n als Zeilenende hat, und du auf die einzelnen Zeilen ein chomp los lässt?
sid burn
 2006-03-30 02:13
#63995 #63995
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=esskar,29.Mar..2006, 23:54]
Code: (dl )
$data =~ s{[\r\n]+$}{};


denn die Preisfrage an dich ist nämlich, was passiert, wenn du unter linux eine Dattei als Textdatei öffnest, die \r\n als Zeilenende hat, und du auf die einzelnen Zeilen ein chomp los lässt?[/quote]
Er substituiert logischerweise nur die "\n" am ende weg, während die Tollen "^M" am ende jeder zeile stehen bleiben.

Was habe ich den Gewonnen? :)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
renee
 2006-03-30 12:25
#63996 #63996
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ein anerkennendes Nicken...

Gerade dieses Problem sollte man immer im Hinterkopf haben. Das Problem tritt häufiger auf als man vielleicht denkt. Vor allem in Firmen mit heterogenen Netzen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-03-30 12:34
#63997 #63997
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=renee,30.03.2006, 10:25]Gerade dieses Problem sollte man immer im Hinterkopf haben. Das Problem tritt häufiger auf als man vielleicht denkt. Vor allem in Firmen mit heterogenen Netzen.[/quote]
und bei der CGI-programmierung (textareas). vergisst man auch ganz gerne mal.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
GwenDragon
 2006-03-30 14:44
#63998 #63998
User since
2005-01-17
14837 Artikel
Admin1
[Homepage]
user image
Nicht nur bei der CGI-Programmierung.
Auch bei Dateien, die als Textdatenspeicher dienen wie .htxyz.
Wenn das FTP-Programm nicht kapiert, was Zeilenenden auf anderen Systemen sind, dann läuft das auf dem lokalen Windows gut, aber auf Linux o. ä. klappt dann das Einlesen nicht mehr richtig.
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2006-03-23 11:52.