2012-06-14 2 views
5

backticksの変数は、readpipe関数に渡されたときに展開されないようです。 readpipe関数をオーバーライドすると、どのように変数を展開できますか?これを実行するPerlリードパイプハンドラで変数を展開するにはどうすればよいですか?

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

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

ができます:

Run:ls /root 
Run:ls $dir 

私は私が書いていたテストコードのための外部コールを模擬しようとしています。どこかでCPANモジュールがあれば、これを手助けすることができます。それも助けになります。

更新

私は私の問題には本当に醜い回避策を使用することにしました。バックティックの代わりにreadpipe()を使用すると、変数が正しく展開されます。テストを実行する前に自動スクリプトクリーナーを使用しています。テストを実行する前にすべてのバッククックをreadpipe()に変換します。

例えばランニング:

$ cat t.pl 

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

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

与える:

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

を私はまだかかわらず、クリーンな解決策を探しています。

答えて

3

これはPerlのバグのようです。報告するにはperlbugを使用してください。

1

おそらくIPC::Runを使用します。

use IPC::Run 'run'; 

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

それとも、出力をキャプチャしたくなかった場合は、system()は、モジュールの参照用

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

おかげで良いかもしれません。しかし私は、バックテストとシステム()のようなシステムコールを模擬して、レガシーコードのユニットテストを実行する簡単な方法を探しています。 –

+0

@SandipBhattacharya私は問題を理解していないと確信しています。 backticksとexecはシステムが動作している間は出力を返しません。 evalとqxは法案に適合しますか? – shinronin

+0

@shinronin私はそれらを安全にテストできるように、既存のレガシーコードでバッククォートをオーバーライド/モックしようとしています。バッククォートを模倣するために '* CORE :: GLOBAL :: readpipe'を置き換えることはできますが、引数に展開する変数が含まれている場合には機能しません。 backticksと 'readpipe()'との間のこの一貫性のない動作のために、そのようなコードを模擬するのは難しいです。 私は新しいコードを書こうとしていません。もし私がしたら、バックチックの代わりに 'readpipe()'を使っていたので、望むならコードを模倣することができます。 –

関連する問題