2009-04-28 5 views
26

Perl supporta tre modi (che io sappia) di eseguire programmi esterni:Quali sono le differenze tra sistema e backtick e pipe in Perl?

system:

system PROGRAM LIST 

come in:

system "abc"; 

backticks come in:

`abc`; 

passando attraverso un tubo come in:

open ABC, "abc|"; 

Quali sono le differenze tra di loro? Ecco quello che so:

  1. È possibile utilizzare i backtick e le pipe per ottenere facilmente l'output del comando.
  2. il gioco è fatto (più in modifiche future?)

risposta

35
  • sistema(): eseguito il comando e restituisce lo stato l'uscita di comando
  • backticks: eseguito il comando e restituisce l'output del comando
  • pipe: esegue il comando e consente di utilizzare come handle

Anche i backtick reindirizza lo STDOUT del programma eseguito a una variabile e il sistema lo invia allo STDOUT del programma principale.

+0

pipe è un controllo a grana più fine dei backtick. i backtick restituiscono lo STDOUT, come in: $ date = 'date'. Con le pipe, puoi decidere quando e come leggere l'output o inviare segnali al processo. –

2

il sistema restituisce anche il valore di uscita dell'applicazione (ERRORLEVEL in Windows). I pipe sono un po 'più complicati da usare, poiché leggendo da loro e chiudendoli si aggiunge del codice extra. Infine, hanno un'implementazione diversa che doveva fare cose diverse. Usando le pipe sei in grado di comunicare con le applicazioni eseguite, mentre gli altri comandi non lo permettono (facilmente).

1

Lo stato di uscita del programma non è limitato a system(). Quando chiami close(PIPE), restituisce lo stato di uscita e puoi ottenere l'ultimo stato di uscita per tutti e 3 i metodi da $?.

Si prega di notare, inoltre, che

readpipe('...') 

è lo stesso di

`...` 
+0

potresti completare questa frase? Si prega di notare che readpipe ('...') invece di .... –

+0

Ho corretto la formattazione per renderla più chiara. L'uso di apici inversi per indicare il tipo fisso rende difficile la scrittura di * backtick reali * ... – ephemient

+0

Come ulteriore nota, '...' e qx /.../ (e qx (...) e qx # ... # e qualsiasi altro delimitatore) sono anche equivalenti. – ephemient

3

La documentazione perlipc spiega i vari modi in cui è possibile interagire con altri processi di Perl, e perlfunc's open documentation spiega le filehandles pipe.

  • Il sistema invia il suo output sullo standard output (ed errori)
  • Gli apici inversi cattura standard output e lo restituisce (ma non standard error)
  • L'open pipe consente di catturare l'output e leggere da un handle di file o da stampare su un handle di file e utilizzarlo come input per il comando esterno.

Ci sono anche moduli che gestiscono questi dettagli con i casi di bordo multipiattaforma.