open(FILE,'<',$ARGV[0]) or die 'Error opening input file';
You should include the $! variable in the error message so you know why it failed to open:
open FILE, '<:raw', $ARGV[0] or die "Error opening '$ARGV[0]' $!";
while (read (FILE,$_,4)) {
Just because you ask for 4 bytes that does not mean the operating system will give you 4 bytes. You should verify that you actually received 4 bytes.
read (FILE,$_,$rec_len);
Same thing here.
if ($tiff_flag) {
The only place that you assign any value to $tiff_flag is at the beginning where you set it to 0 so it will always be false.
or die "Can't create image file";
You should include the $! variable in the error message so you know why it failed to open.