为什么perl抱怨;“open”的参数太多;当我在shell脚本中运行它时?

为什么perl抱怨;“open”的参数太多;当我在shell脚本中运行它时?,perl,Perl,我运行我的Perl脚本(gettotal.pl),它运行得很好。我设法得到TOTAL.txt的总和,并将输出值附加到test.txt。但是当我在shell脚本(test.sh)中运行它时,我得到了以下错误: open at/home/daily/scripts/per_NODE_HR/gettotal.pl第29行“$dir”附近的参数太多 由于编译错误,/home/daily/scripts/per_NODE_HR/gettotal.pl的执行被中止 手动运行(./gettotal.pl)和在

我运行我的Perl脚本(gettotal.pl),它运行得很好。我设法得到TOTAL.txt的总和,并将输出值附加到test.txt。但是当我在shell脚本(test.sh)中运行它时,我得到了以下错误:

open at/home/daily/scripts/per_NODE_HR/gettotal.pl第29行“$dir”附近的参数太多 由于编译错误,/home/daily/scripts/per_NODE_HR/gettotal.pl的执行被中止

手动运行(./gettotal.pl)和在shell脚本中运行有什么区别?简单但仍然让我困惑:-)

gettotal.pl


几乎可以肯定,
perl
!=<代码>/opt/perl/bin/perl


尝试
哪个perl

您得到的错误表明您的系统perl是一个真正古老的版本。。。perl 5.6.0(2000年3月22日发布)中添加了
open
的三参数形式,因此,如果抱怨
open
的参数太多,似乎表明您正在将代码传递给5.5.x或更旧的perl。在命令行上尝试
perl-v
,查看系统perl的版本

至于如何解决这个问题,只需在shell脚本中调用
/home/daily/scripts/per_NODE_HR/gettotal.pl
,而不是
perl/home/daily/scripts/per_NODE_HR/gettotal.pl
,它将被传递到shebang(
)行中指定的
/opt/perl/bin/perl-w
,就像使用
/gettotal.pl
手动运行它一样

顺便说一句,您可能还希望添加
use warnings
以及
use strict
,而不是依赖于使用
perl-w
运行的代码。如果使用
perl 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;
#!/bin/sh

perl /home/daily/scripts/per_NODE_HR/gettotal.pl