例えば
Windows-XP-prompt>perl -MBenchmark -e "{my $m=1;timethis(10,'&f($m,2)');}sub f{print join ' ',@_[0,1],'';}"
において、Benchmark::timethisなどに渡すコードはプライベート変数を覗くことができないようなので、ベンチマーク中に出力ファイルハンドルへ吐きだされる文字列が 2 2 2 ... となるのは理解できます。
プライベート変数の内容を使うコードをテストしたい場合は、
Windows-XP-prompt>perl -MBenchmark -e "{my $m=1;our @o=($m,2);timethis(10,'&f(@o)');}sub f{print join ' ',@_[0,1],'';}"
のように、timethisを呼び出す直前にour宣言などしたグローバル変数を介してコードに内容を渡すのが、一番考えられる方法でしょうか。
しかしこれは正直、手際が悪いと感じるので、もっと手際のいい方法を欲しています。
timethis() はコードリファレンスを渡せますよ。
perl -MBenchmark -e "my \$m=1;timethis(10, sub {print join ' ',\$m,2,'';})"
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 timethis 10: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
Windows-XP-prompt>perl -MBenchmark -e "{my $m=1;timethis(1000000,qq{\&f($m)});}sub f{print @_;}"
もあるのでしょうけれど、$aに変な文字を入れるとエラーになってしまいます。
perlはActivePerl、環境の一部は次の通りです。
perl -MBenchmark -e "print $Benchmark::VERSION
1.07
perl -V 一部
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=MSWin32, osvers=5.0, archname=MSWin32-x86-multi-thread