2009-04-28 17 views
26

Perl soporta tres maneras (que yo sepa) de ejecutar programas externos:¿Cuál es la diferencia entre el sistema y los retropalos y tuberías en Perl?

system:

system PROGRAM LIST 

como en:

system "abc"; 

acentos abiertos como en:

`abc`; 

ejecutándolo a través de una tubería como en:

open ABC, "abc|"; 

¿Cuáles son las diferencias entre ellos? Esto es lo que sé:

  1. Puede usar patillas y tuberías para obtener la salida del comando fácilmente.
  2. eso es todo (más en futuras ediciones?)

Respuesta

35
  • sistema(): ejecuta el comando y devuelve el estado salida del comando
  • acentos abiertos: comando se ejecuta y devuelve la salida del comando
  • pipes: ejecuta el comando y le permite usar como un controlador

También backticks redirige el STDOUT del programa ejecutado a una variable, y el sistema lo envía al STDOUT de su programa principal.

+0

tuberías es un control de grano más fino de los apoyos posteriores. los backticks devuelven el STDOUT, como en: $ date = 'date'. Con las tuberías, puede decidir cuándo y cómo leer la salida, o enviar señales al proceso. –

2

sistema también está devolviendo el valor de salida de la aplicación (ERRORLEVEL en Windows). Las tuberías son un poco más complicadas de usar, ya que leerlas y cerrarlas agrega un código adicional. Finalmente, tienen una implementación diferente que tenía la intención de hacer cosas diferentes. El uso de tuberías le permite volver a comunicarse con las aplicaciones ejecutadas, mientras que los otros comandos no permiten eso (fácilmente).

1

Obtener el estado de salida del programa no está limitado a system(). Cuando llama al close(PIPE), devuelve el estado de salida y puede obtener el último estado de salida para los 3 métodos desde $?.

Tenga en cuenta también que

readpipe('...') 

es lo mismo que

`...` 
+0

¿podría completar esta oración? Tenga en cuenta también que readpipe ('...') en lugar de ... –

+0

Repare el formato para hacerlo más claro. El uso de marcadores para indicar el tipo fijo hace que sea difícil escribir * backs * real * ... – ephemient

+0

Como nota adicional, '...' y qx /.../ (y qx (...) y qx # ... # y cualquier otro delimitador) también son equivalentes. – ephemient

3

La documentación perlipc explica las diversas formas en que se puede interactuar con otros procesos de Perl y perlfunc's open documentation explica los controladores de archivo entubados.

  • El sistema envía su salida a la salida estándar (y errores)
  • Los acentos abiertos captura la salida estándar y la devuelve (pero no el error estándar)
  • El abierto por tubería le permite capturar la salida y leer desde un identificador de archivo, o para imprimir en un manejador de archivo y usarlo como entrada para el comando externo.

También hay módulos que manejan estos detalles con las cajas de borde de plataforma cruzada.

Cuestiones relacionadas