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
を私はまだかかわらず、クリーンな解決策を探しています。
おかげで良いかもしれません。しかし私は、バックテストとシステム()のようなシステムコールを模擬して、レガシーコードのユニットテストを実行する簡単な方法を探しています。 –
@SandipBhattacharya私は問題を理解していないと確信しています。 backticksとexecはシステムが動作している間は出力を返しません。 evalとqxは法案に適合しますか? – shinronin
@shinronin私はそれらを安全にテストできるように、既存のレガシーコードでバッククォートをオーバーライド/モックしようとしています。バッククォートを模倣するために '* CORE :: GLOBAL :: readpipe'を置き換えることはできますが、引数に展開する変数が含まれている場合には機能しません。 backticksと 'readpipe()'との間のこの一貫性のない動作のために、そのようなコードを模擬するのは難しいです。 私は新しいコードを書こうとしていません。もし私がしたら、バックチックの代わりに 'readpipe()'を使っていたので、望むならコードを模倣することができます。 –