Thread Sysopen in Kombination mit seek/sysseek und print
(12 answers)
Opened by Gast at 2007-06-25 11:09
Hallo Ralph,
also, entweder du benutzt sysread(), syswrite() und sysseek() oder aber read(), print(), tell(), seek(). Beides zu vermischen ist keine gute Idee, so steht es auch in der Dokumentation! Quote Warum? Schau her... Erst mal ein wenig Code zum Testen: Code: (dl
)
1 use strict; Ausgabe von sys_verwenden() Position: 50 Buffer: AAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBBBBBBBBB CCCC Wie du hier sehen kannst, macht sysread() und sysseek() genau das, was es machen soll. sysread() liest 50 Bytes ein und sysseek() zeigt an, wo man sich gerade befindet. Korrekt also! Weiter im Geschehen... Ausgabe von vermischt()  138 AAAAAAAAAAAAAAAAAAAAAA  138 BBBBBBBBBBBBBBBBBBBBBB  138 CCCCCCCCCCCCCCCCCCCCCC  138 DDDDDDDDDDDDDDDDDDDDDD  138 EEEEEEEEEEEEEEEEEEEEEE  138 FFFFFFFFFFFFFFFFFFFFFF Genau! WTF! Die Byteposition ist immer das Ende der Datei, die genau 138 Bytes groà ist. Also macht es überhaupt keinen Sinn <$fh> und sysseek() zu vermischen. Soweit ich weiÃ, verwendet Perl readline(), wenn <$fh> benutzt wird. Dann wird für gewöhnlich eine Zeile eingelesen, wenn $/ nicht manipuliert wurde! Weiter... Ausgabe von ohne_sys()  23 AAAAAAAAAAAAAAAAAAAAAA  46 BBBBBBBBBBBBBBBBBBBBBB  69 CCCCCCCCCCCCCCCCCCCCCC  92 DDDDDDDDDDDDDDDDDDDDDD  115 EEEEEEEEEEEEEEEEEEEEEE  138 FFFFFFFFFFFFFFFFFFFFFF Das schaut doch schon besser aus! Hier wird genau die Mischung benutzt die du brauchst: readline() + tell() + seek(). So, weiter zu deinem Skript, was ich ein wenig angepasst habe: Code: (dl
)
1 use strict; Ausgabe: AAAAAAA¡aaaaaaa¡aaa BBBB¡bbbb¡bbb CCCCCC¡cccc¡ccc DDDDDDDD¡ddddd¡dddd E-E-E¡eeeeeeeeee¡eee FFFF¡fffff¡ff GGGGGG¡ggggggggggggg¡ggg HHHHH¡hhhhh¡h Das ist doch genau das was du wolltest? Hier noch ein paar Erläuterungen: use utf8; und binmode $fh, ':utf8'; Wenn du in deinem Perlskript utf8 Zeichen verwendest, dann musst du das Perl auch mitteilen, ansonsten wird sowas hier geschrieben: E-E-Eáeeeeeeeeeeáeee Gleiches gilt für das Filehandle. Du möchtest ja nicht nur lesen, sondern auch schreiben. Also teile doch auch hier Perl mit, dass du utf8 lesen und schreiben möchtest. Ohne utf8 steht bei mir immer in $feld1 folgendes: EEEEE&� und somit kann "EEEEE" nicht matchen! Gruss, opi\n\n <!--EDIT|opi|1182855038--> What is a good module? That's hard to say.
What is good code? That's also hard to say. One man's Thing of Beauty is another's man's Evil Hack. |