perlbinaryfilesactivestate

Problems reading a binary file with ActivePerl?


I'm trying to read a binary file with the following code:

open(F, "<$file") || die "Can't read $file: $!\n";
binmode(F);
$data = <F>;
close F;

open (D,">debug.txt");
binmode(D);
print D $data;
close D;

The input file is 16M; the debug.txt is only about 400k. When I look at debug.txt in emacs, the last two chars are ^A^C (SOH and ETX chars, according to notepad++) although that same pattern is present in the debug.txt. The next line in the file does have a ^O (SI) char, and I think that's the first occurrence of that particular character.

How can I read in this entire file?


Solution

  • If you really want to read the whole file at once, use slurp mode. Slurp mode can be turned on by setting $/ (which is the input record separator) to undef. This is best done in a separate block so you don't mess up $/ for other code.

    my $data;
    {
        open my $input_handle, '<', $file or die "Cannot open $file for reading: $!\n";
        binmode $input_handle;
        local $/;
        $data = <$input_handle>;
        close $input_handle;
    }
    
    open $output_handle, '>', 'debug.txt' or die "Cannot open debug.txt for writing: $!\n";
    binmode $output_handle;
    print {$output_handle} $data;
    close $output_handle;
    

    Use my $data for a lexical and our $data for a global variable.