Perl 5.8.1 と 5.18.X 対応2013年12月15日 20時25分49秒

Perl 5.18 系だと make check で fail することがわかりました。

Perl 5.18 ではハッシュ周りに修正が入っているようです。

 > ハッシュのランダム化
 >
 > Perl のハッシュ関数が使う種はランダムになりました。 これは、
 > keys(), values(), each() のような関数が返すキー/値の
 > 順序は実行毎に異なるということです。

この修正の影響を受けており、Perl 5.8.1 の時のように環境変数 PERL_HASH_SEED に 0 を指定すると pass します。

PERL_HASH_SEED = 0 の有無の違いを調べたところ、 mhonarc.pl の each を使う部分があるのですが、

   # Format MHonArc X comment extracted headers as regular headers
   my $mha_header = "";
   my($fld_name, $fld_value);
   while (($fld_name, $fld_value) = each %$mha_fields) {
      $mha_header .= join('', $fld_name, ': ', $fld_value, "\n");
   }

each が返すキー/値の順番が実行毎に異なるため、$mha_header の 内容が変わってしまいます。

内容が変わるといっても、フィールドと値のペアの出現順が変わる だけですが、これによってフレーズが変わることになります。

ここのフィールドと値のペア間でのフレーズは、本来意味をなさない ものではありますが。

とりあえず実行毎に $mha_header の内容が変わらないようにすれば make check は通るようです。

mhonarc.pl のバグとは言えませんが、例えば以下のように修正しました。

   for my $key (sort keys %$mha_fields) {
       $mha_header .= join('', $key, ': ', $mha_fields->{$key}, "\n");
   }

なお、$mha_header の内容は実行毎に同じになりますが、ソートしているため、修正前のものを 5.18 より前の Perl で動かして作成した インデックスとは内容が異なるものと思います。

が、前述のように意味のないフレーズ部分ですので、大きな問題では ないものと思います。

この修正で PERL_HASH_SEED = 0 は 5.8.1 でも不要となりましたので、mknmz の 5.8.1 チェックも外しました。

これらの修正を行い、コミットしました。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://namazu.asablo.jp/blog/2013/12/15/7109900/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。