2012-06-14 9 views
5

Sembra che le variabili in backticks non vengono espanse quando viene passato sulla funzione readpipe. Se sovrascrivo la funzione readpipe, come faccio ad espandere le variabili?Come si espandono le variabili nei gestori Perl readpipe?

BEGIN { 
*CORE::GLOBAL::readpipe = sub {print "Run:@_\n"}; 
} 

`ls /root`; 
my $dir = "/var"; 
`ls $dir`; 

L'esecuzione di questo dà:

Run:ls /root 
Run:ls $dir 

sto cercando di prendere in giro le chiamate esterne per un codice di prova che sto scrivendo. Se c'è un modulo CPAN da qualche parte che può aiutare a prendersi cura di tutto questo, sarebbe di aiuto.

Aggiornamento:

ho deciso di utilizzare una soluzione veramente brutto al mio problema. Si scopre che l'uso di readpipe() anziché i backticks espande le variabili correttamente. Sto usando uno script cleaner automatico prima di eseguire i miei test che converte tutti i backticks in readpipe() prima di eseguire i test.

es Esecuzione:

$ cat t.pl 

BEGIN { 
    *CORE::GLOBAL::readpipe = sub {print "Run:@_\n"}; 
} 

`ls /root`; 
my $dir = "/var"; 
`ls $dir`; 
readpipe("ls $dir"); 

Dà:

$ perl t.pl 
Run:ls /root 
Run:ls $dir 
Run:ls /var 

sto ancora cercando per una soluzione più pulita però.

risposta

3

Questo sembra essere un bug in Perl. Utilizzare perlbug per segnalarlo.

1

probabilmente si desidera utilizzare IPC::Run invece.

use IPC::Run 'run'; 

run [ "ls", $dir ], ">", \my $stdout or die "Cannot run - $!"; 

O se non si desidera catturare l'uscita, system() può essere meglio

system("ls", $dir) == 0 or die "Cannot system - $!"; 
+1

Grazie per la ref modulo. Tuttavia, sto cercando un modo semplice per prendere in giro le chiamate di sistema come backtick e system() per eseguire il mio unittests di un codice legacy. –

+0

@SandipBhattacharya sono sicuro che non capisco il problema. backtick ed exec non restituiscono alcun output mentre il sistema lo fa. valeva e qx si adattano al conto? – shinronin

+0

@shinronin Sto cercando di ignorare/backticks finte nel codice legacy esistenti in modo che io possa provare in modo sicuro. Mentre posso sostituire il '* CORE :: GLOBAL :: readpipe' a backticks finte, non stanno lavorando nei casi in cui l'argomento include variabili da espandere. A causa di questo comportamento incoerente tra backtick e 'readpipe()' è difficile prendere in giro questo tipo di codice. Non sto cercando di scrivere nuovo codice. Se lo facessi, avrei usato 'readpipe()' invece che i backtick in modo da poter prendere in giro il codice se lo desideravo. –

Problemi correlati