Why does perl complain about "Too many arguments for open" when I run it in a shell script?
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;
sh开发者_如何学JAVAell 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 open
was added in perl 5.6.0 (released March 22, 2000), so a complaint about your open
having too many arguments would seem to indicate that you're passing your code to a 5.5.x or older perl. Try perl -v
on 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.pl
instead of perl /home/daily/scripts/per_NODE_HR/gettotal.pl
and it will get passed to /opt/perl/bin/perl-w
as 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 warnings
along with use strict
instead of relying on your code being run with perl -w
. If you use perl gettotal.pl
, warnings will not be enabled.
Almost certainly, perl
!= /opt/perl/bin/perl
.
Try which perl
.
精彩评论