Home > Enterprise >  Perl wildcards in the file paths
Perl wildcards in the file paths

Time:01-19

I am working on my project where the GNU Makefile should automatically test my Perl program with different input files. I have this code which reads only one file from inputs directory, searches stop words and outputs out.txt file with frequency table of non-stop words.

#!/usr/bin/perl

use strict;
use warnings;

use Lingua::StopWords qw(getStopWords);

my %found;

my $src = '/programu-testavimas/1-dk/trunk/tests/inputs/test.txt';
my $des = '/programu-testavimas/1-dk/trunk/tests/outputs/out.txt';

open(SRC,'<',$src) or die $!;
open(DES,'>',$des) or die $!;
my $stopwords = getStopWords('en');
while( my $line = <SRC>){
      $found{$_} for grep { !$stopwords->{$_} }
            split /\s /, lc $line;
}
print DES $_, "\t\t", $found{$_}, $/ for sort keys %found;

close(SRC);
close(DES);

My goal is to test many files with separate case.sh scripts where the input files should be different in each case, this is one of the case:

#!/bin/sh
perl /programu-testavimas/1-dk/trunk/scripts/test.pl /programu-testavimas/1-dk/trunk/tests/inputs/test.txt > /home/aleksandra/programų-testavimas/1-dk/trunk/tests/outputs/out.txt

Then, my Makefile at once should test program with different inputs in each case. So, right now I'm struggling with my Perl code where my input file is only one individual and I need to make it read different files in inputs directory. How can I change path correctly that bash scripts could have each case with individual input file?

EDIT: I tried this with glob function but it outputs empty file

open(DES,'>',$des) or die $!;
my $stopwords = getStopWords('en');
for my $file ( glob $src ) {
  open(SRC,'<',$file) or die "$! opening $file";
  while( my $line = <SRC>){
        $found{$_} for grep { !$stopwords->{$_} }
              split /\s /, lc $line;
  }
  print DES $_, "\t\t", $found{$_}, $/ for sort keys %found;
  close(SRC);
}

close(DES);

CodePudding user response:

Correct me if I'm wrong, but to me it sounds like you have different shell scripts, each calling your perl script with a different input, and redirecting your perl's script output to a new file.

You don't need to glob anything in your perl script. It already has all the information it needs: which file to read. Your shell script/Makefile is handling the rest.

So given the shell script

#!/bin/sh
perl /path/to/test.pl /path/to/input.txt > /path/to/output.txt

Then in your perl script, simply read from the file provided via the first positional parameter:

#!/usr/bin/perl

use strict;
use warnings;

use Lingua::StopWords qw(getStopWords);

my %found;

my $stopwords = getStopWords('en');
while(my $line = <>) {
      $found{$_} for grep { !$stopwords->{$_} }
            split /\s /, lc $line;
}
print $_, "\t\t", $found{$_}, $/ for sort keys %found;

while(<>) will read from STDIN or from ARGV.

Your shell script could then call your perl script with different inputs and define outputs:

#!/bin/sh
for input in /path/to/*.txt; do
  perl /path/to/test.pl "$input" > "$input.out"
done
  •  Tags:  
  • perl
  • Related