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 チェックも外しました。
これらの修正を行い、コミットしました。
最近のコメント