5

readpipe 関数に渡されたときに、バッククォート内の変数が展開されていないようです。readpip 関数をオーバーライドした場合、変数を展開するにはどうすればよいですか?

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

私はまだよりクリーンなソリューションを探しています。

4

2 に答える 2

3

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

于 2012-06-14T06:54:57.507 に答える