2012-06-14 4 views
5

Es scheint, dass Variablen in Backticks nicht erweitert werden, wenn sie an die Readpipe-Funktion übergeben werden. Wenn ich die Readpipe-Funktion überschreibe, wie erweitere ich Variablen?Wie erweitere ich Variablen in Perl-Readpipe-Handlern?

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

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

Laufen ergibt dies:

Run:ls /root 
Run:ls $dir 

Ich versuche, externe Anrufe für einen Testcode zu verspotten, die ich schreibe. Wenn es irgendwo ein CPAN-Modul gibt, das helfen kann, sich um all das zu kümmern, würde das auch helfen.

aktualisieren:

Ich habe beschlossen, eine wirklich hässliche Abhilfe zu meinem Problem zu verwenden. Es stellt sich heraus, dass die Verwendung von readpipe() anstelle von Backticks Variablen korrekt erweitert. Ich verwende einen automatischen Skript-Cleaner, bevor ich meine Tests ausführe, die alle Backticks in readpipe() konvertieren, bevor die Tests ausgeführt werden.

beispiels Laufen:

$ cat t.pl 

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

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

Gibt:

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

Ich suche immer noch, obwohl für eine saubere Lösung aus.

Antwort

3

Das scheint ein Fehler in Perl zu sein. Verwenden Sie perlbug, um es zu melden.

1

Sie möchten wahrscheinlich stattdessen IPC::Run verwenden.

use IPC::Run 'run'; 

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

Oder wenn Sie nicht den Ausgang erfassen wollen, kann system() besser

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

Dank für das Modul ref sein. Ich bin jedoch auf der Suche nach einem einfachen Weg, um Systemaufrufe wie Backticks und System(), um meine Untestests von einem Legacy-Code auszuführen. –

+0

@SandipBhattacharya Ich bin sicher, ich verstehe das Problem nicht. Backticks und Exec geben keine Ausgabe zurück, während das System dies tut. Würde eval und qx die Rechnung passen? – shinronin

+0

@shinronin Ich versuche, Backticks in bestehendem Legacy-Code zu überschreiben, damit ich sie sicher testen kann. Während ich die "* CORE :: GLOBAL :: readpipe" ersetzen kann, um Backticks zu simulieren, funktionieren sie nicht in Fällen, in denen das Argument zu erweiternde Variablen enthält. Wegen dieses inkonsistenten Verhaltens zwischen Backticks und 'readpipe()' ist es schwierig, solchen Code zu verspotten. Ich versuche nicht, neuen Code zu schreiben. Wenn ich es getan hätte, hätte ich 'readpipe()' anstelle von Backticks benutzt, damit ich den Code nachahmen kann, wenn ich das möchte. –

Verwandte Themen