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

[ad_1]

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

[ad_2]

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