のようなものを与えられた
foreach (keys %myHash) {
... do stuff ...
}
foreach (keys %myHash) {
... do more stuff ...
}
ハッシュが変更されていない場合、Perlは一貫した順序でキーを反復処理することが保証されていますか?
キーは明らかにランダムな順序で返されます。実際のランダムな順序は、perl の将来のバージョンで変更される可能性がありますが、 or関数が生成する順序と同じであることが保証されています
values
each
(ハッシュが変更されていない場合) 。Perl 5.8.1 以降、セキュリティ上の理由から、Perl の異なる実行間でも順序が異なります (「アルゴリズムの複雑さへの攻撃」を参照perldoc perlsec
)。
(私のものを強調)
編集:
通常のハッシュには一貫した順序がありますが、Tie ハッシュの場合、ユーザーが制御するため、キーの順序は明確に定義されていません!
ハッシュ キーの順序は変わりませんが、なぜこれを行う必要があるのかを再考する必要があります。
おそらく、2 パスではなく 1 パスでハッシュを処理できますか?
データのサイズが大きくて複製が問題にならない限り、防御的なプログラミング手法としてハッシュ キーを配列に保存する必要があります。おまけとして、リストを簡単に並べ替えて、明確に定義された順序でハッシュを処理することもできます。例えば、
my @keys = sort keys %myHash;
これにより、配列の順序は変更しない限り変更されないため、ハッシュの変更に関する問題が回避されます。
これを行わない場合は、ハッシュを変更するようなことをしないように細心の注意を払う必要があります。そうしないと、要素の順序が変更されます。Readonlyモジュールを調べて、このハッシュが変更されていないことを確認してください。
これはかなり危険な期待です。おそらくそうなるでしょうが、なぜ心配する必要がありますか?事前にキーをフェッチし、結果を保存してから、保存した結果を反復処理します。次に、同じ順序でキーにアクセスすることが保証されます。未指定の実装の詳細の境界を回避することは危険です。
編集:ドキュメントの「保証」を見逃しましたが、これが決して変わらないことを期待するのは危険だと思います。特に、同じ目的を達成するためのより健全な方法がある場合.