Перл вызывает перл

У меня возникают ошибки разрешения с perl.

Perl-скрипт вызывает другой с помощью конфигурационного файла. executeParsers.pl --> прочитать файл конфигурации --> вызвать parser1.pl

Ошибка возникает только тогда, когда в файле конфигурации есть 2 строки. Файл : ssh.conf*

OBS,9 Cegetel,Altitude;sh ip int;shipint;parser1.pl
OBS,9 Cegetel,Altitude;sh int status;shintstatus;parser2.pl

Файл : executeParsers.pl

$DIR="/tech/gtr/scripts/osm/environnement_qualif/scan-rh2";

open(SSHCONFIG, "$DIR/bin/ssh.conf");
while (<SSHCONFIG>) {
    $ifname = (split)[0];
    my @status = split /;/;
    for (@status) {
            print ("$_ \n");
        }
    #@ligne = split(/;/, $_ );
    $listop = $status[0];
    $listcmd = $status[1];
    $fileprefix = $status[2];
    print "prefixe trouve $fileprefix \n";
    $parsername = $status[3];

    $tab=`find $DIR/working-dir -type f -name \"$fileprefix*\"`;
    print "j'ai trouve les fichiers suivant : $tab \n";
    @table = split(/\n/,$tab);

    for ($index = 0; $index <= $#table; $index++) {
        print "le fichier numero $index est : $table[$index]\n";
        $fichier = $table[$index];
        print "fichier traite : $fichier\n";
        system("/usr/bin/perl $DIR/parsers/$parsername $fichier");
    }
}
close (SSHCONFIG);

И файл parser1.pl

$fichier=$ARGV[0]; # fichier a traiter par le parser
warn $fichier;
$output=$fichier."_OUTPUT";
chomp($fichier); # Suppression des \n incongrus
@cstemp1 = split(/\//,$fichier);
@cstemp2 = split(/_/,$cstemp1[$#cstemp1]);
$cs = $cstemp2[1];
$ip = $cstemp2[2];
my ($etat, $ifname, $myip); # Variables a la chaine

# Ouverture des flux d'entrée et de sortie
open(DATA,$fichier) || die ("Erreur d'ouverture de $fichier\n") ;
close(DATA);

Что теперь происходит при выполнении?

perl executeParsers.pl
OBS,9 Cegetel,Altitude
sh ip int
shipint
parser1.pl

prefixe trouve shipint
j'ai trouve les fichiers suivant : /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/working-dir/shipint_952923S1_<ip>

le fichier numero 0 est : /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/working-dir/shipint_952923S1_<ip>
fichier traite : /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/working-dir/shipint_952923S1_<ip>
Warning: something's wrong at /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/parsers/parser1.pl line 7.
Erreur d'ouverture de
sh: line 1: /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/working-dir/shipint_952923S1_<ip>: Permission denied
OBS,9 Cegetel,Altitude
sh int status
shintstatus
parser2.pl
prefixe trouve shintstatus
j'ai trouve les fichiers suivant :

Теперь, если я удалю вторую строку из моего файла ssh.conf, она будет работать. Я предполагаю, что что-то не так с концом строки.


person Gui O    schedule 04.08.2014    source источник
comment
Похоже, $fichier пусто.   -  person choroba    schedule 04.08.2014
comment
какое разрешение для фактического файла, кроме рабочего каталога?   -  person lihao    schedule 04.08.2014
comment
Поскольку вы не показали нам код в parser1.pl, который приводит к сообщению об ошибке, трудно понять, что происходит не так. Я рекомендую создать MCVE (Как создать минимальный, полный и проверяемый пример?) или SSCCE (Короткий, самодостаточный, правильный пример) — два названия (и ссылки) для одной и той же идеи. MCVE будет иметь два небольших скрипта — может быть, по 10 строк каждый, возможно, короче. Обратите внимание, что есть способы указать исполняемый файл Perl, например $^X или $EXECUTABLE_NAME, если вы используете use English '-no_match_vars';.   -  person Jonathan Leffler    schedule 04.08.2014
comment
Рассмотрите возможность использования: system("/usr/bin/perl", "$DIR/parsers/$parsername", "$fichier"); с использованием списка аргументов для system. Это вообще позволяет избежать выполнения оболочки. Любопытно сообщение об ошибке, очевидно, идентифицирующее то, что вы считаете именем файла, как если бы это было имя сценария. Что именно у вас есть в линии shebang parser1.pl?   -  person Jonathan Leffler    schedule 04.08.2014


Ответы (2)


$fichier скорее всего не содержит того, что вы думаете. Используйте warn $fichier;, чтобы узнать, что он содержит перед использованием. Кроме того, используйте три аргумента open и переменную $!, чтобы узнать, почему что-то пошло не так:

open(my $fh, "<", "input.txt")
or die "cannot open < input.txt: $!";

http://perldoc.perl.org/functions/open.html

person Dr.Avalanche    schedule 04.08.2014
comment
Это не ответ на вопрос и должен быть комментарием - person Borodin; 04.08.2014
comment
Я напечатал аргумент перед отправкой на parser1.pl, есть действительный аргумент... - person Gui O; 04.08.2014

Еще одна ошибка возврата каретки.

При печати полного вывода переменных мы имеем:

prefixe trouve shipint
operateurs : OBS,9 Cegetel,Altitude
commandes : sh ip int
parser name : parser1.pl

j'ai trouve les fichiers suivant : /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/working-dir/shipint_952923S1_126.110.101.250

le fichier numero 0 est : /tech/gtr/scripts/osm/environnement_qualif/scan-rh2/working-dir/shipint_952923S1_126.110.101.250

Это означает, что в $parsername есть возврат каретки, который нужно удалить с помощью

$parsername =~ s/\s+\z// ;
person Gui O    schedule 05.08.2014