Chap Harrison wrote:
On May 9, 2010, at 11:57 AM, John W. Krahn wrote:This *may* work -- UNTESTED: use Fcntl ':seek'; my $filename = 'binary_file'; open my $FH, '+<:raw', $filename or die "Cannot open '$filename' $!"; read $FH, my $data, -s $FH or die "Cannot read from '$filename' $!"; length $data == -s $FH or die "Could only read ", length $data, " bytes from a ", -s $FH, " byte file.\n"; $data =~ s/(?<=SASI {6}.{20}).{20}(?=2009$schno)/$mybinary/s; seek $FH, 0, SEEK_SET or die "Cannot seek on '$filename' $!"; print $FH $data;And it does! But doing a bit more dabbling, I tried replacing your last three lines with: $data =~ m/(?<=SASI {6}.{20}).{20}(?=2009$schno)/s; # change from s/// to m// seek $FH, $-[0], SEEK_SET or die "Cannot seek on '$filename' $!"; # seek to offset of match print $FH $mybinary; # just replace 20 bytes ... which also works, and avoids potentially re-writing a large amount of data. Any reason I might not want to do it this way?
No, that should work just as well.
(It occurs to me that if the file is really that large, I might have a more serious problem reading it all into memory in the first place.)
Yes, if you can't read it all into memory then it becomes a bit more complicated.
John -- The programmer is fighting against the two most destructive forces in the universe: entropy and human stupidity. -- Damian Conway -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected] http://learn.perl.org/
