当我在shell脚本中运行它时,为什么perl会抱怨"打开的参数太多"?

Shi*_*iel 0 perl

我运行我的Perl脚本(gettotal.pl),它工作正常.我设法得到TOTAL.txt的总和,并将输出值附加到test.txt.但是当我在shell脚本(test.sh)中运行它时出现了这个错误:

在/home/daily/scripts/per_NODE_HR/gettotal.pl第29行打开太多参数,在""$ dir附近")"/home/daily/scripts/per_NODE_HR/gettotal.pl的执行因编译错误而中止.

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

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;
Run Code Online (Sandbox Code Playgroud)


shell脚本

#!/bin/sh

perl /home/daily/scripts/per_NODE_HR/gettotal.pl
Run Code Online (Sandbox Code Playgroud)

Dav*_*man 8

您得到的错误表明您的系统perl是一个真正古老的版本... open在perl 5.6.0(2000年3月22日发布)中添加了三个参数形式,所以抱怨你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它传递给/opt/perl/bin/perl-wshebang(#!)行中的指定,就像手动运行它一样./gettotal.pl.

顺便说一句,你可能还需要添加一个use warnings沿use strict,而不是依靠你的代码与正在运行perl -w.如果使用perl gettotal.pl,则不会启用警告.