10

のようなものを与えられた

foreach (keys %myHash) {
   ... do stuff ...
}

foreach (keys %myHash) {
   ... do more stuff ...
}

ハッシュが変更されていない場合、Perlは一貫した順序でキーを反復処理することが保証されていますか?

4

3 に答える 3

27

はい。からperldoc -f keys:

キーは明らかにランダムな順序で返されます。実際のランダムな順序は、perl の将来のバージョンで変更される可能性がありますが、 or関数が生成する順序と同じであることが保証されていますvalueseach(ハッシュが変更されていない場合) 。Perl 5.8.1 以降、セキュリティ上の理由から、Perl の異なる実行間でも順序が異なります (「アルゴリズムの複雑さへの攻撃」を参照perldoc perlsec)。

(私のものを強調)

于 2009-08-10T18:43:51.573 に答える
0

編集:

通常のハッシュには一貫した順序がありますが、Tie ハッシュの場合、ユーザーが制御するため、キーの順序は明確に定義されていません!


ハッシュ キーの順序は変わりませんが、なぜこれを行う必要があるのか​​を再考する必要があります。

おそらく、2 パスではなく 1 パスでハッシュを処理できますか?

データのサイズが大きくて複製が問題にならない限り、防御的なプログラミング手法としてハッシュ キーを配列に保存する必要があります。おまけとして、リストを簡単に並べ替えて、明確に定義された順序でハッシュを処理することもできます。例えば、

   my @keys = sort keys %myHash;

これにより、配列の順序は変更しない限り変更されないため、ハッシュの変更に関する問題が回避されます。

これを行わない場合は、ハッシュを変更するようなことをしないように細心の注意を払う必要があります。そうしないと、要素の順序が変更されます。Readonlyモジュールを調べて、このハッシュが変更されていないことを確認してください。

于 2009-08-10T19:38:35.427 に答える
-2

これはかなり危険な期待です。おそらくそうなるでしょうが、なぜ心配する必要がありますか?事前にキーをフェッチし、結果を保存してから、保存した結果を反復処理します。次に、同じ順序でキーにアクセスすることが保証されます。未指定の実装の詳細の境界を回避することは危険です。

編集:ドキュメントの「保証」を見逃しましたが、これが決して変わらないことを期待するのは危険だと思います。特に、同じ目的を達成するためのより健全な方法がある場合.

于 2009-08-10T18:55:51.440 に答える