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

时间:2010-01-27 10:22:49

标签: 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;


shell脚本

#!/bin/sh

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

2 个答案:

答案 0 :(得分:8)

你得到的错误表明你的系统perl是一个真正古老的版本...... open的三参数形式被添加到perl 5.6.0(2000年3月22日发布)中,所以a关于您的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({{1}中的指定传递给/opt/perl/bin/perl-w }})line,就像用#!手动运行它时一样。

顺便提一下,您可能还想添加./gettotal.pluse warnings,而不是依赖于使用use strict运行的代码。如果您使用perl -w,则不会启用警告。

答案 1 :(得分:4)

几乎可以肯定,perl!= /opt/perl/bin/perl

尝试which perl