[Solved] Modify Perl script to run for each file with specified extension in a given directory


I think I managed to generate this correctly (on iPad, sat on the sofa) … There could be some typos ; )

Usage: perl test_x397.pl <path>

test_x397.pl

#!/usr/bin/perl -w
use strict; use warnings;
use Encode;

my ($path) = @ARGV;
$path // die "No path specified";
(-e $path) or die "Path not found: $path";
(-d $path) or die "Not a directory: $path";

my @files = <$path/*.x937>;

foreach my $file (@files) {
   process($file);
}

sub process {
    my ($fname) = @_;

    my ($dir, $file) = $fname =~ m{^(.*)/(.+)$};

    my $tiff_flag = 0;
    my $count = 0;
    my $outfile = sprintf("%s/output_%s.txt", $dir, $file);

    open (my $outfh, '>', $outfile) or die "Unable to create $outfile. $!";

    open (my $infh, '<:raw', $file) or die "Error opening '$file'. $!";


    my $buffer = undef;

    while (read ($infh,$buffer,4)) {
        my $rec_len = unpack("N", $buffer);
        die "Bad record length: $rec_len" unless ($rec_len > 0);
        read ($infh, $buffer, $rec_len);

        if (substr($buffer, 0, 2) eq "\xF5\xF2") {
            if ($tiff_flag) {
                $count++;
                my $tiff_filename = sprintf('%s/output_%s_img%04d.tiff', $dir, $file, $count);
                open (my $tiffh, '>', $tiff_filename) or die "Can't create image file $!";
                binmode($tiffh) or die 'Error setting binary mode on image file';
                print $tiffh substr($buffer, 117);
                close $tiffh;
            }
            $buffer = substr($buffer, 0, 117);
        }
        print $outfh decode ('cp1047', $buffer) . "\n";
    }
    close $infh;
    close $outfh;
}

A few things to note:

  1. Always use the three argument version of open
  2. Using a scalar filehandle makes it easier to pass it around (not necessary in this example but good practice)
  3. Don’t modify $_. It can lead to nasty surprises in larger programs
  4. You already used sprintf to make part of your tiff filename, so why not use it for the whole thing.

12

solved Modify Perl script to run for each file with specified extension in a given directory