IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

commande qx ?


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut commande qx ?
    salut,

    J'aurai aimé savoir le role de la fonction qx ?
    Si on tape par exemple qx(/home/rep/file) elle va retourné `/home/rep/file` ?
    Quel est l'interet ?


    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par donny
    salut,

    J'aurai aimé savoir le role de la fonction qx ?
    Si on tape par exemple qx(/home/rep/file) elle va retourné `/home/rep/file` ?
    Quel est l'interet ?


    Merci
    L'intérêt est qu'en faisant qx(chaine), tu peux ensuite faire exécuter chaine.

    Voici ce qu'en dit le perldoc :

    qx/CHAINE/
    ‘CHAINE‘

    Une chaîne qui est (éventuellement) interpolée puis exécutée comme une commande système par /bin/sh ou équivalent. Les jokers, tubes (pipes) et redirections sont pris en compte. L’ensemble de la sortie standard de la commande est renvoyé ; la sortie d’erreur n’est pas affectée. Dans un contexte scalaire, le résultat est retourné comme une seule chaîne (potentiellement multi-lignes). Dans un contexte de liste, le résultat est une liste de lignes (selon la définition des lignes donnée par $/ ou $INPUT_RECORD_SEPARATOR).
    Puisque les apostrophes inverses (backticks) n’affectent pas la sortie d’erreur, il vous faut utiliser la (les) syntaxe(s) de redirection du shell (en supposant qu’elle(s) existe(nt)) afin de capter les erreurs. Pour récupérer les sorties STDOUT et STDERR d’une commande :
    $output = ‘cmd 2>&1‘;

    Pour récupérer STDOUT et faire disparaître STDERR:
    $output = ‘cmd 2>/dev/null‘;

    Pour récupérer STDERR et faire disparaître STDOUT (l’ordre est ici très important) :
    $output = ‘cmd 2>&1 1>/dev/null‘;

    Pour échanger STDOUT et STDERR afin de récupérer STDERR tout en laissant STDOUT s’afficher normalement :
    $output = ‘cmd 3>&1 1>&2 2>&3 3>&-‘;

    Pour récupérer STDOUT et STDERR séparément, il est plus simple et sain de les rediriger séparément vers des fichiers qui seront lus lorsque l’exécution de la commande sera terminée :
    system("program args 1>/tmp/program.stdout 2>/tmp/program.stderr");

    L’utilisation de l’apostrophe comme délimiteur protège la commande de l’interpolation normalement effectuée par Perl sur les chaînes entre guillemets. La chaîne est passée tel quelle au shell :
    $perl_info = qx(ps $$); # Le $$ de Perl
    $shell_info = qx’ps $$’; # Le $$ du nouveau shell

    Remarquez que la manière dont la chaîne est évaluée est entièrement dépendante de l’interpréteur de commandes de votre système. Sur la plupart des plates-formes, vous aurez à protéger les méta-caractères du shell si vous voulez qu’ils soient traités littéralement. En pratique, c’est difficile à faire, surtout qu’il n’est pas toujours facile de savoir quels caractères doivent être protégés. Voir le manuel perlsec pour un exemple propre et sûre d’utilisation manuelle de fork() et exec() pour émuler proprement l’utilisation des backticks.

    Sur certaines plates-formes (particulièrement celles style DOS) le shell peut ne pas être capable de gérer des commandes multi-lignes. Dans ce cas, l’usage de passages à la ligne dans la chaîne de commande ne donne pas ce que vous voulez. Vouspouvez évaluez plusieurs commandes sur une seule et même ligne et les séparant par le caractère de séparation de commandes si votre shell le supporte (e.g. ; pour la plupart des shells Unix; & sur le cmd shell de Windows NT).

    Depuis la version v5.6.0, Perl tente de vider les tampons de tous les fichiers ouverts en écriture avant de lancer la commande mais cela n’est pas supporté sur toutes les plates-formes (voir le manuel perlport). Pour être plus sûr, vous devriez positionné la variable $| ($AUTOFLUSH en anglais) ou appelé la méthode autoflush() des objets IO::Handle pour chacun des descripteurs ouverts.
    N’oubliez pas que certains shells ont quelques restrictions sur la longueur de la ligne de commande. Vous devez vous assurer que votre chaîne n’excède pas cette limite même après interpolation. Voir les notes spécifiques à votre plate-forme pour plus de détails sur votre environnement particulier.
    L’utilisation de cet opérateur peut aboutir à des programmes difficiles à porter puisque les commandes shells appelées varient d’un système à l’autre et peuvent parfois ne pas exister du tout. À titre d’exemple, la commande type du shell POSIX est très différente de la commande type sous DOS. Cela ne signifie pas qu’il vous faut à tout prix éviter cet opérateur lorsque c’est le bon moyen de faire ce que vous voulez. Perl a été conçu pour être un "glue language"... La seule chose qui compte c’est que vous sachiez ce que vous faites.

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    je vois pas trop l'utilité

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Ben moi si

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    quoi donc ?
    fait nous profitez de ton savoir

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Je te renvoie à ce qu'en dit Perldoc, suffit de lire

  7. #7
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    garde le ton secret

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Et si tu prenais la peine de lire le second post de ce sujet ???

    C'était bien la peine que je m'amuse à faire un copy/paste de ce que disait Perldoc

    Tu as un forfait "messages impairs visibles uniquement" sur ce forum ou bien ?

  9. #9
    Membre habitué Avatar de rcageot
    Profil pro
    rien
    Inscrit en
    Septembre 2006
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : rien

    Informations forums :
    Inscription : Septembre 2006
    Messages : 128
    Points : 170
    Points
    170
    Par défaut
    bouge pas, je fais un message pair

    qx = quoted executable.
    La chaîne de caractères qui s'y trouve est simplement transformée par Perl en un appel de la ligne de commande. La sortie standard de la commande appelée, du programme étranger ou du script est capturée et peut être sauvegardée dans une variable. Une autre possibilité de noter cette sorte de chaîne de caractères exécutable, sont ce qu'on appelle les Backticks. Là vous travaillez au lieu de qx(commande quelconque) avec l'accent grave ` en notant une `commande quelconque`.
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $sortie = qx(/usr/bin/executable /donnees/parametre1 /donnees/parametre2);
    print "$sortie";
    Si un ricard vaut un steak, j'ai bien bouffé une vache hier soir !
    L'art de poser les bonnes questions dans les forums afin de ne pas passer pour un

  10. #10
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Points : 144
    Points
    144
    Par défaut
    merci cageot
    le truc c'est que je suis debutant en perl
    et donc il y a certaine chose qui sont nouvelle et que je ne comprend pas du premier coup, ni du deuxieme

Discussions similaires

  1. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55
  2. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  3. [Kylix] Commandes linux ss kylix
    Par csnickos dans le forum EDI
    Réponses: 3
    Dernier message: 15/09/2002, 20h24
  4. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  5. Réponses: 2
    Dernier message: 11/08/2002, 21h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo