[PERL] - diff d'une sortie d'un programme

Résolu/Fermé
EverDraft Messages postés 24 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 23 août 2008 - 2 déc. 2007 à 00:47
EverDraft Messages postés 24 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 23 août 2008 - 2 déc. 2007 à 13:38
Bonjour,
Je programme en ce moment un Shell et pour tester mes fonctions je me suis mis au perl. Ce language etant plus puissant que le script shell j'essaie de le maitriser. Mais voila j'ai un souci pour faire la diff de mes sortie d'execution.
Pour lancer mon binaire j'utilise la fonction system() mais je n'arrive pas a faire de diff.
Lorsque j'essaie
if (print(system("../42SH --version")) eq "42sh version is 0.5\n")
{
print("OK\n");
}
else
{
print("KO\n");
}

des zero s'affiche avant ma diff et j'ai droit a un KO a chaque fois meme si ma sortie est bonne.
Si quelqu'un peut m'aider je lui en serais infiniment reconnaissant.
Merci ;)

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 déc. 2007 à 00:56
Salut,

Si tu veux capturer le résultat d'une commande il faut utiliser plutôt qx// au lieu de system()
voici un exemple qui pourra peut être t'aider
#!/usr/bin/perl
use strict;use warnings;
my $cmd = qx/sh --version | head -1/;
print "$cmd\n";
if (qx/sh --version | head -1/ eq "GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)\n"){
        print "OK\n";
}else{
        print "KO\n";
}
__END__

Exécution
lami20j@debian:~/trash$ perl ccm.pl
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)

OK

0
EverDraft Messages postés 24 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 23 août 2008 1
2 déc. 2007 à 01:48
Merci pour ta reponse mais mon probleme persiste toujours,
avec tes conseils j'ai essaye mais j'obtiens:
"Can't exec "qx/../42sh": No such file or directory at ./moulette.pl line 80.
Use of uninitialized value in concatenation (.) or string at ./moulette.pl line 81."
j'ai juste modifie "qx/sh" par "qx/../42sh":

my $cmd = `qx/../42sh --version | head -1/`;
print "$cmd\n";
if ("qx/../42sh --version | head -1/" eq "42sh version is 0.5\n"){
print "OK\n";
}else{
print "KO\n";
}

Si tu pense savoir d'ou viens le probleme je cherche toujours...
En tout cas merci quand meme.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 déc. 2007 à 09:54
Salut,

utilise le chemin absolu
comme la séparation des répertoires est faite avec des slash alors qx// ne vas rien comprendre puisque après le 2 slash Perl va croire qu'il doit lire une commande

Donc en ce cas tu peut faire comme ça
- mettre un backslash avet chaque slash à l'intérieur de qx//
qx/\/chemin\/vers\/commande/
- utilise un autre séparateur pour qx
qx[/chemin/vers/commande]
qx(/chemin/vers/commande)
qx{/chemin/vers/commande}
--

lami20j
0
EverDraft Messages postés 24 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 23 août 2008 1
2 déc. 2007 à 13:38
Un grand merci a mon sauveur.
La solution etait bien de changer de separateur.
Mon prgramme de diff marche nikel.
Merci vraiment.
Voila la solution:

my $pwd = `pwd`;
if (qx{$pwd../42sh --version} eq "42sh version is 0.5\n"){
print "OK\n";
}else{
print "KO\n";
}
0