King0 has asked for the wisdom of the Perl Monks concerning the following question:

Below is a script I've put together that is supposed to read names from a file and using the system's grep program determine if those names are in a spreadsheet. The script runs the grep program, but receives errors such as: "No such file or directory," in spite of the files existing. My hunch is there is an issue with how my script handles spaces in the arguments - i.e. the names & directories. Anyone know what I've done wrong? Help is appreciated.

#!/usr/bin/perl my $can_list; my $can_archive; if (@ARGV) { $can_list = $ARGV[0]; $can_archive = '\"'.$ARGV[1].'\"'; } else { die "Need both new candidate list and candidate list archive!"; } # Open candidate list open LIST, $can_list or die "Cannot open new candidate list file! $!"; # Open results log open LOG, ">/data/My Documents/candidates_results.log" or die "Could n +ot open candidate search log!"; while (<LIST>) { @results = `grep -i $_ $can_archive`; foreach $result (@results) { print LOG $result . "\n"; } } close LOG; close LIST;

NOTE: the names file looks like:

Jon Doe Jim Jonson Dan Smith

Replies are listed 'Best First'.
Re: Executing external program via backquotes
by jwkrahn (Abbot) on Feb 10, 2010 at 22:44 UTC

    You probably want something like this (UNTESTED):

    #!/usr/bin/perl use warnings; use strict; unless ( @ARGV == 2 ) { die "Need both new candidate list and candidate list archive!\n"; } my ( $can_list, $can_archive ) = @ARGV; # Open candidate list open LIST, '<', $can_list or die "Cannot open new candidate list file! + $!"; chomp( my @new_candidates = <LIST> ); # Open results log open LOG, '>', '/data/My Documents/candidates_results.log' or die "Cou +ld not open candidate search log: $!"; open LIST, '<', $can_archive or die "Cannot open '$can_archive' $!"; while ( my $line = <LIST> ) { foreach my $result ( @new_candidates ) { print LOG $line if $line =~ /$result/i; } } close LOG; close LIST;
Re: Executing external program via backquotes
by 5mi11er (Deacon) on Feb 10, 2010 at 22:09 UTC
    Well, you're already surrounding the directory you're searching through with double quotes, now try surrounding the $_ argument with double quotes too:
    @results = `grep -i "$_" $can_archive`;
    -Scott

      Thanks for the suggestion; I had that in my first version of the script -- but unfortunately double quoting $_ doesn't resolve the issue. Rather, when the argument is supplied to grep it some how breaks the argument into to separate ones, in spite of the variable being double quoted. For example, if the $_ variable held Jon Doe -- the error would be:

      grep Jon: No such file or directory grep Doe: No such file or directory
      Do you have any other suggestions? Thanks. -Dan