开发者

Why does perl complain about "Too many arguments for open" when I run it in a shell script?

开发者 https://www.devze.com 2022-12-18 18:15 出处:网络
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:

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消