Main Content

Handling binary data in Perl is easy!

Archive - Originally posted on "The Horse's Mouth" - 2011-08-30 12:56:54 - Graham Ellis

Perl can handle binary data just as easily as ASCII text - but YOU - if you're the programmer - must understand the format of the data that you'll be working with. With binary data it's every bit as important to get the right bytes in the right places as it is to get the appropriate separators between fields and lines in an ASCII file ... indeed, it's perhaps more important as you can't check your output file by pulling it into a text editor.

How does it work?

• Binary data can be held in a Perl scalar as a string. Unlike char array base string functions in C, there is no special character that's reserved for the end of string so you have total flexibility.

• You can read any number of bytes that you wish from a file (binary of otherwise) using Perl's read function.

• You can unpack the buffer that you've read the data into a list of variables, using all sorts of differet formats - see
  perldoc -f pack
for details and there are all sorts of other resources such as [this one]

• you can reassemble a new binary string with pack from a list of scalars and

• you can output the binary string with print.

Surprisingly, it reall is that easy!

Here's an example ...

Reading a binary file:

  open (FH,"talker.gif") or die;
  read (FH,$buffer,-s "talker.gif");
  close FH;


Getting data out of the binary file (you MUST know the format!)

  ($magic, $subtype, $widf, $ight) = unpack("A3A3vv",$buffer);
  print "Image was $widf by $ight and is type $subtype or $magic\n";


And writing a binary file:

  open (FHO,">shouter.gif") or die;
  print FHO $buffer;
  close FHO;


If you want to read and write your file through random access, you can uses seek - there's an example [here] on our website and another [here]. There's also a function called tell which tells you where you are in the file. Personally, I don't recommend its use - you should know where you are if your coding to a high standard, and it's one of the few things we don't have an example of on the site.

With binary files, you'll sometimes find that you require several programs to access them at the same time, and you can use the flock function to (cooperatively) lock them - there's an example of that [here]. And you can do clever things with sysread to read without buffering ... and sysread has "friends" such as syswrite and sysseek but - good on the Perl team - no systell. Example - [here].


Illustrattion - delegate on one of last week's Perl courses. Click on image to enlarge.