修改Perl脚本以针对给定目录中具有指定扩展名的每个文件运行

时间:2015-02-09 21:50:50

标签: perl

我需要修改Perl脚本x937.pl以在特定目录中的扩展名为.x937的所有文件上运行。目前,我使用一个单独的脚本test.pl来调用我的主脚本,并为该类型的每个文件运行它。但是,我需要将两者合并为一个脚本。

理想情况下,我可以在脚本中指定目录路径,并遍历该目录中的所有*.x937文件。

test.pl

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

my @files = <*.x937>;

foreach my $file (@files) {
    system('x937.pl', $file);
}

x937.pl

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

my $tiff_flag = 0;
my $count     = 0;
my $file      = "output_$ARGV[0].txt";

unless ( open OPUT, '>' . $file ) {
    die "Unable to create $file";
}

open FILE, '<:raw', $ARGV[0] or die "Error opening '$ARGV[0]' $!";
binmode( FILE ) or die 'Error setting binary mode on input file';

while ( read( FILE, $_, 4 ) ) {
    my $rec_len = unpack( "N", $_ );
    die "Bad record length: $rec_len" unless ( $rec_len > 0 );
    read( FILE, $_, $rec_len );
    if ( substr( $_, 0, 2 ) eq "\xF5\xF2" ) {
        if ( $tiff_flag ) {
            $count++;
            open( TIFF, '>', 'output_' . $ARGV[0] . '_img' . sprintf( "%04d", $count ) . '.tiff' )
                    or die "Can't create image file $!";
            binmode( TIFF ) or die 'Error setting binary mode on image file';
            print TIFF substr( $_, 117 );
            close TIFF;
        }
        $_ = substr( $_, 0, 117 );
    }
    print OPUT decode( 'cp1047', $_ ) . "\n";
}
close FILE;

close OPUT;

1 个答案:

答案 0 :(得分:0)

我想我设法正确地生成了这个(在iPad上,坐在沙发上)......可能会有一些拼写错误; )

用法: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;
}

有几点需要注意:

  1. 始终使用open
  2. 的三个参数版本
  3. 使用标量文件句柄可以更容易地传递它(在本例中不是必需的,但是很好的做法)
  4. 不要修改$ _。它可能会导致较大程序中令人讨厌的惊喜
  5. 您已经使用sprintf制作了tiff文件名的一部分,所以为什么不将它用于整个文件。