2010-03-10 10 views
23

Ho un problema con la funzione system. Voglio memorizzare l'output delle funzioni di sistema in una variabile.Come posso archiviare l'output della funzione di sistema di Perl su una variabile?

Per esempio,

system("ls"); 

qui voglio tutti i nomi dei file nella directory corrente per memorizzare in una variabile. So che posso farlo reindirizzando l'output in un file e letto da quello e lo memorizzo in una variabile. Ma voglio un modo efficace di quello. C'è un modo.

+1

uso variabile 'i miei $ output = qx (ls 2> &1);' l'ultima parte è quella di catturare sia stdout e stderr –

risposta

16

No, non è possibile memorizzare i valori dell'uscita ls, dal sistema di eseguire sempre il comando come un processo figlio, in modo da provare con backtick `comando` che esegue il comando nella corrente processo stesso!

+4

@abubacker -. Backticks fa eseguire un –

+5

I backtick eseguono il comando in un processo figlio e ne acquisiscono l'output.Se si desidera eseguire il comando nello stesso processo, si utilizza 'exec' - ma non verrà mai restituito perché il codice Perl originale non viene più eseguito dopo trasformando il processo in un altro comando: –

+0

Come si fa a catturare l'output di un comando in una variabile senza mostrarlo sullo schermo? – antred

12

Il modo più semplice utilizza backticks o qx():

my $value = qx(ls); 
print $value; 

L'output è simile al ls.

+1

'echo' i s un comando shell, gli equivalenti Perl sono chiamati 'print' e' say'. – daxim

+0

Che funziona per ls, ma non per il comando find, per quello immagino i suoi backtick, http://stackoverflow.com/questions/3854651/how-can-i-store-the-result-of-a-system- command-in-a-perl-variabile. –

10

La mia risposta non risolve il problema. Tuttavia, se si desidera VERAMENTE fare l'elenco delle directory, non chiamare il sistema ls in questo modo. Utilizzare opendir(), readdir() o un ciclo while.

Per esempio,

while (<*>){ 
    print $_ ."\n"; 
} 

Infatti, se non è un programma proprietario di terze parti, cerca sempre di proprie funzioni utente del Perl.

7

La documentazione ufficiale Perl per il built-in system stati di funzionamento:

Questo non è ciò che si desidera utilizzare per catturare l'output da un comando, per che si dovrebbe usare solo backticks o qx //, come descritto in "STRING" in perlop.

Ci sono molti modi per accedere facilmente ai documenti:

  1. Nella riga di comando: perldoc -f system
  2. Online perldoc.perl.org.
  3. Cerca sul Web utilizzando Google.

Se si desidera che ogni directory annuncio memorizzato in un elemento di array separato, utilizzare:

my @entries = qx(ls); 
9

Come abubacker ha dichiarato, è possibile utilizzare apici inversi per catturare l'output di un programma in una variabile per un uso successivo.Tuttavia, se anche è necessario verificare la presenza di valori di ritorno eccezionali, o bypass invocando la shell, è il momento di portare in un modulo CPAN, IPC::System::Simple:

use IPC::System::Simple qw(capture); 

# Capture output into $result and throw exception on failure 
my $result = capture("some_command"); 

Questo modulo può essere chiamato in una varietà di modi, e permette per personalizzare quali valori di errore restituiti sono "accettabili", se ignorare la shell o meno e come gestire il raggruppamento di argomenti. Fornisce anche una sostituzione drop-in per system() che aggiunge più controllo degli errori.

0

Un modo rapido e semplice per farlo è quello di utilizzare qx() appositamente per il tuo esempio:

my $output = qx(ls 2>&1);

La 2>&1 parte è quello di catturare sia stdout e stderr.

2

Utilizzare backticks viene salvato il risultato in un

$output = `ls`; 
+0

Bene, questa informazione era già stata data in altre risposte. – fancyPants

Problemi correlati