Почему Perl жалуется на «слишком много аргументов для открытия», когда я запускаю его в сценарии оболочки? - PullRequest
0 голосов
/ 27 января 2010

Я запускаю свой Perl-скрипт ( gettotal.pl ), и он отлично работает. Мне удалось получить сумму TOTAL.txt и добавить выходное значение в test.txt. Но когда я запускаю его внутри сценария оболочки ( test.sh ), я получаю эту ошибку:

Слишком много аргументов для открытия в /home/daily/scripts/per_NODE_HR/gettotal.pl строка 29, рядом с "" $ dir ")" Выполнение /home/daily/scripts/per_NODE_HR/gettotal.pl прервано из-за ошибок компиляции.

В чем разница между запуском вручную (./gettotal.pl) и запуском внутри скрипта оболочки? Простой, но все еще сбивает с толку для меня: -)

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

Ответы [ 2 ]

8 голосов
/ 27 января 2010

Ошибка, которую вы получаете, говорит о том, что ваш системный perl является действительно древней версией ... Форма open с тремя аргументами была добавлена ​​в perl 5.6.0 (выпущен 22 марта 2000 г.), так что жалоба на ваш open, имеющий слишком много аргументов, может показаться, что вы передаете свой код в perl 5.5.x или старше. Попробуйте perl -v в командной строке, чтобы увидеть, какая версия системного Perl.

Что касается того, как решить эту проблему, назовите его в своем скрипте оболочки просто /home/daily/scripts/per_NODE_HR/gettotal.pl вместо perl /home/daily/scripts/per_NODE_HR/gettotal.pl, и он будет передан /opt/perl/bin/perl-w, как указано в строке shebang (#!), точно так же делает, когда вы запускаете его вручную с ./gettotal.pl.

Кстати, вы также можете добавить use warnings вместе с use strict вместо того, чтобы полагаться на то, что ваш код запускается с perl -w. Если вы используете perl gettotal.pl, предупреждения не будут включены.

4 голосов
/ 27 января 2010

Почти наверняка, perl! = /opt/perl/bin/perl.

Попробуйте which perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...