何にでも、より安全なの反復処理キーのPerlのハッシュ?
質問
している場合は、Perlのハッシュ本気(key,value)のペアは、どういう方法を繰り返し処理している全てのキー?と聞いていることを each
場合も意図しない副作用を持つ.なので、そのためには、主に以下の方法、それより良いそうです。
# Method 1
while (my ($key, $value) = each(%hash)) {
# Something
}
# Method 2
foreach my $key (keys(%hash)) {
# Something
}
解決
の経験則はその機能を利用するに最適なります。
また、キーとなる 読む されるものであり、使用keys():
foreach my $key (keys %hash) { ... }
また、それらの値を使用価値():
foreach my $val (values %hash) { ... }
が必要な場合は、キー や の値は、各():
keys %hash; # reset the internal iterator so a prior each() doesn't affect the loop
while(my($k, $v) = each %hash) { ... }
場合はプラン変更の鍵のハッシュせ を除く を削除する現在のキーの繰り返しはしないでください各().例えば、このコード新セットの大文字キーを増値動作をキー():
%h = (a => 1, b => 2);
foreach my $k (keys %h)
{
$h{uc $k} = $h{$k} * 2;
}
の製造が期待されたハッシュ:
(a => 1, A => 2, b => 2, B => 4)
が使用される()と同じもの:
%h = (a => 1, b => 2);
keys %h;
while(my($k, $v) = each %h)
{
$h{uc $k} = $h{$k} * 2; # BAD IDEA!
}
生誤の結果に予測する。例えば:
(a => 1, A => 2, b => 2, B => 8)
しかし、これは安全な:
keys %h;
while(my($k, $v) = each %h)
{
if(...)
{
delete $h{$k}; # This is safe
}
}
すべてのイベントの詳細な説明のperlドキュメンテーション
% perldoc -f keys
% perldoc -f each
他のヒント
一つのことに注意する必要がありますので利用の場合 each
することを
側面の効果を加えることで、"国家"へのハッシュ(ハッシュを覚えてい
その"次へ"キー)です。使用時のようなコードでは、スニペットを掲載し、
を繰り返し処理を実行し、全体のハッシュが一、これは通常でない
問題です。しかし、走りにくトラックの問題をいかしながら
経験)を each
とともに諸表のように
last
または return
出口から while ... each
ループする前に
っていないすべての鍵となります。
この場合、ハッシュまで覚えているキーはすでに返され、
ご利用の際は each
ので、次回も、理由に関係のない作品
コードを入力してください続けます。
例:
my %hash = ( foo => 1, bar => 2, baz => 3, quux => 4 );
# find key 'baz'
while ( my ($k, $v) = each %hash ) {
print "found key $k\n";
last if $k eq 'baz'; # found it!
}
# later ...
print "the hash contains:\n";
# iterate over all keys:
while ( my ($k, $v) = each %hash ) {
print "$k => $v\n";
}
この版画:
found key bar
found key baz
the hash contains:
quux => 4
foo => 1
何が起きたのかをキー"bar"baz"?彼らはまだありますが、
第 each
開始最初の一人となり、停止時の終わりに達するハッシュ、そしていよいようにします。
場所 each
する原因となりますので問題であることから、scoped iterator.これらは一例です:
while ( my ($key,$val) = each %a_hash ) {
print "$key => $val\n";
last if $val; #exits loop when $val is true
}
# but "each" hasn't reset!!
while ( my ($key,$val) = each %a_hash ) {
# continues where the last loop left off
print "$key => $val\n";
}
きることを保証する必要があり each
がすべてのキーと値を確認する必要があります利用 keys
または values
第てがリセットの反復子).を参照 各メソッドのドキュメントを参照.
をそれぞれの書式を予防し、全体のキーセットから生成されます。この重要な使用している場合は、提携edハッシュをデータベース単位百万内に表示されません。トライアル発のキーのリストを一度に排気体メモリ。この場合各として、反復子はキーで実際に発生する全体配列の前にループが始まります。
その場所"をそれぞれ"はリアル利用時のハッシュは非常に大規模に比べてメモリをご利用)。あみがされるようにすることが、ハッシュ自体なライブメモリーもませんがグ、ハンドヘルドデータ収集装置も小さい。
メモリがないので、通常のマップやキーパラダイムによりprevelantのようにパラダイム
数の雑感にこのトピック:
- あり安全ての反復子のハッシュ。何が安全でないは改変の鍵のハッシュを使って繰り返し処理を行う。(完全に安全で正の値です。) の電位側の効果かを考えることができること
values
エイリアスを返しますと変更していますの内容を変更し、ハッシュ.これによりデザインは性格が異なるかもしれまんの一部。 - ジョーンズ 受け答え は一つの例外:ドキュメントは、明らかによっては追加のキーを繰り返し処理を行ハッシュ.でもデータセットですが正常に行えない現象を改善等に応じてハッシュ。
- 一方で、既に述べたとおり、安心で削除する最後の鍵で返される
each
.この ない truekeys
としてeach
は序で繰り返し処理する反復子をkeys
リストを返す.
いつも使用方法2です。の利益のそれぞれだけ読みな再割り当)の値のハッシュ入力は常にドを参照のハッシュ.
私が噛んだよここにするかという問題はあろうが、この個人の好みです。まいに参考にdocs各()とは異なるためよりkeys()またはvalues()その他の、あなたが"彼らは異なるもの"の答えです。このドキュメントの状態を同一の反復子およびそのすべてを返し実際にリストの値の代わりにコピーし、変更のハッシュを繰り返し処理を行う用意が悪いです。
すべてのと、ほとんど利用keys()ないのでは通常、より自己記録へのアクセスキーの値のハッシュ。こともあり利用価値を()による価値がある大きな構造および鍵のハッシュしたにすでに格納されている構造は、キーが重複しない。きているのだと思いをそれぞれにおいて()の2倍の10年間のPerlプログラムであり、間違った選択を英語が話せなくてもなんとかな=)
普段の使用 keys
やまだひさしをはじめとする思いの時間を使って読むの利用 each
.
を忘れない map
, によっては、何やっているのループ!
map { print "$_ => $hash{$_}\n" } keys %hash;
私は今のと言う:
- 使うのが最も簡単に読み理解のための多いキーは、通常、思う)
- い決まりましたら通常のドラインをサポートしています。
このう2つの主なメリット:
- うめスポット"普通"のコードできますので、再因子に機能/methiods.
- るのが難しいのですが、将来の開発ナンス性の向上にも寄与します。
とは思わないでく使用の鍵それぞれのないよう、必要性の異なる二つの構築のための同様のことだ。