Perl извиква perl

Имам грешки при разрешаване с 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

Друга грешка при връщане на каретка.

При отпечатване на пълния изход на vars имаме:

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