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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    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 Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    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 603
    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 éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    je vois pas trop l'utilité

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    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 603
    Par défaut
    Ben moi si

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

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    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 603
    Par défaut
    Je te renvoie à ce qu'en dit Perldoc, suffit de lire

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