Moin Moin!
Auf Linux 2.6.35.4 (Slackware 13.1 32 bit):
perl -v
This is perl, v5.10.0 built for i486-linux-thread-multi
Copyright 1987-2007, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
perl hotti.pl
Dateilaenge nach Schreiben: 4 Byte
Dateilaenge nach sysopen: 4 Byte
Auf Windows 2000, Strawberry Perl:
perl -v
This is perl, v5.10.0 built for MSWin32-x86-multi-thread
Copyright 1987-2007, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
perl hotti.pl
Dateilaenge nach Schreiben: 4 Byte
Dateilaenge nach sysopen: 3 Byte
Auf Windows XP, Strawberry Perl:
perl -v
This is perl, v5.10.1 (*) built for MSWin32-x86-multi-thread
Copyright 1987-2009, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
perl hotti.pl
Dateilaenge nach Schreiben: 4 Byte
Dateilaenge nach sysopen: 3 Byte
Tja, das stinkt nach einem Problem mit Windoof. Und genau bei 0x1A = Ctrl-Z = Text EOF. Wenn das mal ein Zufall ist.
Perl öffnet Dateien normalerweise im Textmodus, genau wie C und dessen libc. Das ist bei Unixen völlig egal, bei Windoof spielt die libc massiv mit rein und macht lustige Sachen wie \n <=> CR+LF. binmode schaltet diesen Unfug für Binärdateien aus, das sehe ich bei Deinem Script aber nirgendwo. Und sysopen bringt alle Qualen der libc mit sich, während das normale open ohne den Ärger auskommt.
binmode hinter jedem sysopen bringt nichts, denn wenn sysopen fertig ist, ist das Kind schon in den Brunnen gefallen.
Das zweite sysopen öffnet übrigens zum SCHREIBEN und lesen, und erzeugt notfalls auch noch eine Datei (O_RDWR|O_CREAT). Ändere ich das auf O_RDONLY, bleibt die Datei 4 Bytes lang.
Ganz offensichtlich meint die libc, dass die Datei eine Text-Datei ist, und bei der ist das finale Ctrl-Z eben optional und wird bei Gelegenheit gnadenlos entfernt.
Laß also die Finger vom sysopen und alles wird gut.
Oder sorge dafür, dass auch die libc kapiert, dass die Datei keine Textdatei ist (O_BINARY). Mit O_BINARY als zusätzliches Flag in deinem Test bleibt die Datei ebenfalls unbeschädigt.
Wenn ich die sysopen durch reguläre 3-Argument-open ersetze, mit '+<' beim ersten und '<' beim zweiten, bleibt die Datei ebenfalls 4 Bytes lang.
Ich kann das zweite open auch auf '+<' ändern, ohne dass die Datei beschädigt wird. Da die Datei binär ist, würde ich zur Sicherheit das Mode-Argument um ":raw" ergänzen bzw. für antike Perls nach dem open ein binmode einfügen.
Warum mußt Du eigentlich die Zahl auf Krampf binär speichern? Ich kenne keine Hardware und kein Betriebssystem auf dem Perl 5 läuft und eine Blockgröße von weniger als 512 Bytes hat. Du schreibst und liest also immer mindestens 512 Bytes auf die / von der Platte (bzw. die Caches). Da ist es dann völlig egal, ob Du 4 Bytes nutzt oder den Integer dezimal auf 1 bis 10 Bytes verteilst.
Alexander
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".