in reply to Mixed text and binary file

Set binmode at the beginning, and set $/ = 'Binary:';. Do a single read from the filehandle with $text = <FILE>. Then set $/=\64;, and subsequent reads with $chunk = <FILE> will be 64 bytes at a chunk.

Another approach is to use tell once you've found the exact location of Binary:, then seek and read from that point. In this case, I would still start out by setting $/ = 'Binary:', so that I wouldn't have to worry about counting backwards from the next apparent newline to 'Binary:'.


Dave

Replies are listed 'Best First'.
Re^2: Mixed text and binary file
by ahoriuch (Acolyte) on Feb 20, 2014 at 21:10 UTC

    Thanks! Based on your feedback this works. It never ceases to amaze me what perl can do! I'm first preserving the ASCII portion of the file other purposes.

    #!/usr/local/bin/perl use strict; use warnings; my $raw_file="spectrebin.raw"; open (FILE,$raw_file); foreach my $line (<FILE>) { if ($line=~/^Binary:/) { #Do not read the binary part as ascii printf "ASCII: $line"; last; } else { #the ascii part printf "ASCII: $line"; } } close(FILE); open (FILE,$raw_file); binmode(FILE) or die "ERROR> Could not read binary file"; $/ = "Binary:\n"; my $text = <FILE>; my $buffer; while ((read (FILE, $buffer, 64))!=0) { my $binary = unpack("B64",$buffer); printf "Binary: $binary\n"; } close(FILE);
      It never will cease to amaze you ... what Perl can do ... This language has been called a Swiss-Army Knife, and it deserves the accolade.