Rechercher : dans
Par :

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

Dernière réponse le 2 déc 2007 à 13:38:15 EverDraft, le 2 déc 2007 à 00:47:24 
 Signaler ce message aux modérateurs

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 ;)

Configuration: Mac OS X
Firefox 2.0.0.11

Meilleures réponses pour « [PERL] diff d'une sortie d'un programme » dans :
Perl - Entrée et sortie standards Voir Qu'appelle-t-on entrée standard et sortie standard ? Perl permet d'écrire sur la sortie standard, appelée STDOUT et de lire sur l'entrée standard (STDIN). Il s'agit de deux descripteurs fournis par le système d'exploitation et permettant...
Entrées/sorties : Les flux en C++ VoirEntrées/sorties : les flux en C++ 1. Ouvrir un fichier en lecture 1.1 Ouverture du fichier "donnees.txt" en lecture 1.2 Lecture du contenu de "donnees.txt" 2. Ouvrir un fichier en écriture 2.1 Ouverture du fichier "donnees.txt" en...
Désactiver l'exécution de certains programmes au démarrage VoirDésactiver l'exécution de certains programmes au démarrage - Windows 98/Me/2000/XP/Vista Avec msconfig Avec WinPatrol Avec Startuplite Avec CCleaner Remarques Lorsque vous installez des logiciels, certains s'exécutent à chaque...
Télécharger ProgDVB VoirLa diffusion de programme en numérique est de plus en plus en vogue depuis l'apparition de la connexion haut-débit. ProgDVB est un programme destiné à regarder des chaînes TV et à écouter des stations radio sur votre ordinateur. Il supporte le DVB-S...
Perl - Les structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditonnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
Perl - les opérateurs VoirQu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...

1

lami20j, le 2 déc 2007 à 00:56:57

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


lami20j

Répondre à lami20j

2

EverDraft, le 2 déc 2007 à 01:48:46

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.

Répondre à EverDraft

3

lami20j, le 2 déc 2007 à 09:54:16

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

Répondre à lami20j

4

 EverDraft, le 2 déc 2007 à 13:38:15

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";
}

Répondre à EverDraft