2009-04-28 7 views
26

Perl soutient trois façons (que je connais) des programmes externes en cours d'exécution:Quelles sont les différences entre le système et les backticks et les tuyaux dans Perl?

system:

system PROGRAM LIST 

comme dans:

system "abc"; 

accents graves comme dans:

`abc`; 

en cours d'exécution à travers un tuyau comme dans:

open ABC, "abc|"; 

Quelles sont les différences entre eux? Voici ce que je sais:

  1. Vous pouvez utiliser des retours arrière et des tuyaux pour obtenir la sortie de la commande facilement.
  2. qui est ce (plus des modifications futures?)

Répondre

35
    système
  • (): exécute la commande et retourne l'état de sortie de commande
  • contre-apostrophes: exécute la commande et retourne sortie
  • de la commande pipes: exécute la commande et vous permet d'utiliser comme une poignée

Les backticks redirigent également le STDOUT du programme exécuté vers une variable et le système l'envoie vers le STDOUT de votre programme principal.

+0

Les tuyaux sont un contrôle à grain plus fin des contre-bandes. les backticks renvoient le STDOUT, comme dans: $ date = 'date'. Avec les tuyaux, vous pouvez décider quand et comment lire la sortie ou envoyer des signaux au processus. –

2

système renvoie également la valeur de sortie de l'application (ERRORLEVEL sous Windows). Les tuyaux sont un peu plus compliqués à utiliser, car leur lecture et leur fermeture ajoutent du code supplémentaire. Enfin, ils ont une implémentation différente qui était destinée à faire des choses différentes. En utilisant des tuyaux, vous pouvez communiquer avec les applications exécutées, alors que les autres commandes ne le permettent pas (facilement).

1

L'obtention du statut de sortie du programme n'est pas limitée à system(). Lorsque vous appelez close(PIPE), il renvoie le statut de sortie et vous pouvez obtenir le dernier statut de sortie pour les 3 méthodes à partir de $?.

S'il vous plaît noter également que

readpipe('...') 

est le même que

`...` 
+0

pourriez-vous compléter cette phrase? Veuillez également noter que readpipe ('...') au lieu de .... –

+0

J'ai corrigé le formatage pour le rendre plus clair. L'utilisation de backticks pour indiquer fixed-type rend difficile la saisie de backticks * real * ... – ephemient

+0

En outre, '...' et qx /.../ (et qx (...) et qx # ... # et tous les autres délimiteurs) sont également équivalents. – ephemient

3

La documentation perlipc explique les différentes façons que vous pouvez interagir avec d'autres processus de Perl et perlfunc's open documentation explique les handles de fichiers passepoilées.

  • Le système envoie sa sortie à la sortie standard (et erreurs)
  • Les contre-apostrophes capture la sortie standard et retourne (mais pas d'erreur standard)
  • L'ouverture canalisée vous permet de capturer la sortie et de lire à partir d'un descripteur de fichier, ou pour imprimer sur un descripteur de fichier et l'utiliser comme entrée pour la commande externe.

Il existe également des modules qui traitent ces détails avec les boîtiers de bord multiplateformes.