PerlのBenchmarkモジュールへプライベート変数の内容を手際よく渡せないでしょうか。


例えば
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宣言などしたグローバル変数を介してコードに内容を渡すのが、一番考えられる方法でしょうか。

しかしこれは正直、手際が悪いと感じるので、もっと手際のいい方法を欲しています。

回答の条件
  • 1人2回まで
  • 登録:2010/05/06 07:29:48
  • 終了:2010/05/12 08:37:11

回答(4件)

id:Craftworks No.1

Craftworks回答回数20ベストアンサー獲得回数62010/05/06 09:30:45

ポイント80pt

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)

id:imo758
  • コードリファレンスだと関数fの中身をtimethisの中へ記述し直す必要がありませんか。
  • また引数$mがカンマ、引用符、バイナリなどの場合も大丈夫でしょうか。
  • それと

syntax error at -e line 1, near "my \"

Execution of -e aborted due to compilation errors.

と怒られてしまったのですが。

2010/05/06 10:30:27
id:brandbaidu No.2

brandbaidu回答回数24ベストアンサー獲得回数02010/05/06 11:00:54

(はてなにより削除しました)

id:sket-dance7 No.3

とまと回答回数9ベストアンサー獲得回数02010/05/06 18:43:21

最初の回答者さんの提案イイと思いますよ

(#^o^#)/~~~~~

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 きなもち 14 2 0 2010-05-08 16:03:48
  • id:imo758
    簡単な内容の変数なら
    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
  • id:imo758
    一件回答をオープンしておりませんが、引き続き回答を募集しております。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません