I run my Perl script (gettotal.pl) and it works fine. I managed to get the sum of TOTAL.txt and append the output value to test.txt. But when I run it inside shell script (test.sh) I got this error:
Too many arguments for open at /home/daily/scripts/per_NODE_HR/gettotal.pl line 29, near “”$dir”)”
Execution of /home/daily/scripts/per_NODE_HR/gettotal.pl aborted due to compilation errors.
What is the difference between running it manually (./gettotal.pl) and running it inside shell script? Simple yet still confusing for me:-)
gettotal.pl
#!/opt/perl/bin/perl-w
use strict;
my $sum;
open(FH,"/home/daily/scripts/per_NODE_HR/date.txt");
chomp (my @date = <FH>);
my $path = "/home/daily/output/per_NODE_HR/$date[0]/TOTAL.txt";
open(FILE,"$path") or die "Unable to open $path: $!";
my @hits = <FILE>;
$sum=sum($#hits);
print "TOTAL = $sum";
print "\n";
sub sum {
if ($_[0] == 0) {
return $hits[0];
}
return $hits[$_[0]] + sum($_[0]-1);
}
my $dir = "/home/daily/output/per_NODE_HR/$date[0]/test.txt";
open(OUT,'>>', "$dir") or die "Cannot open $dir: $!";
print OUT "TOTAL: $sum";
close OUT;
close FILE;
close FH;
shell script
#!/bin/sh
perl /home/daily/scripts/per_NODE_HR/gettotal.pl
The error you’re getting suggests that your system perl is a truly ancient version… The three-argument form of
openwas added in perl 5.6.0 (released March 22, 2000), so a complaint about youropenhaving too many arguments would seem to indicate that you’re passing your code to a 5.5.x or older perl. Tryperl -von the command line to see what version the system perl is.As for how to resolve this, call it in your shell script with just
/home/daily/scripts/per_NODE_HR/gettotal.plinstead ofperl /home/daily/scripts/per_NODE_HR/gettotal.pland it will get passed to/opt/perl/bin/perl-was specified in the shebang (#!) line, just like it does when you run it manually with./gettotal.pl.Incidentally, you might also want to add a
use warningsalong withuse strictinstead of relying on your code being run withperl -w. If you useperl gettotal.pl, warnings will not be enabled.