2

簡単なプログラムを 1 つ見たことがあります。さて、私が理解しているホールプログラムは、1つのことを除いて、それがハッシュがここでどのように機能しているかです:

プログラム -> リストからの固有要素の抽出

@list = (20,30,40,60,40,20,30,2);
@uniq = ();
%seen = ();
foreach $item (@list) {
    unless ($seen{$item}) 
    {
        # if we get here, we have not seen it before
        push(@uniq, $item);
        $seen{$item}++;

    }
    print %seen;
    print"\n";
}

私の質問は、ハッシュが既存の値と現在の値をどのように比較しているか、つまり、値がすでに存在するかどうかをどのようにチェックしているかです。

4

3 に答える 3

3

それがあなたにとってより明確になる場合は、変更してください

if (!$seen{$item}) { $seen{$item}++; ... }

if (!exists($seen{$item})) { $seen{$item} = 1; ... }

特定のアイテムに初めて遭遇したときは、ハッシュにキーとして存在しないため、ifが入力されます。の本体はif、アイテムに等しいハッシュにキーを作成します。

2 回目 (および 3 回目以降) に特定の項目に遭遇すると、それはハッシュのキーとして存在するため、ifは入力されません。


ところで、

if (!$seen{$item}) { $seen{$item}++; ... }

に短縮できます

if (!$seen{$item}++) { ... }

my @uniq;
for my $item (@list) {
    push @uniq, $item if ...;
}

に短縮できます

my @uniq = grep ..., @list;

したがって、全体は次のように書くことができます

my @list = (20,30,40,60,40,20,30,2);
my %seen;
my @uniq = grep !$seen{$_}++, @list;
于 2012-07-25T15:58:45.890 に答える
1

チェックunless ($seen{$item})は、キーのハッシュ テーブルを調べます$item$seen{$item}キーが見つかった場合、が定義されていてゼロでないため、テストは失敗します。

ハッシュ テーブルにエントリがない場合:

push(@uniq, $item);   # store this item
$seen{$item}++;       # and increment the value for this key in the hash table

未定義の値は であると見なされる0ため、ステートメント$seen{$item}++はその値を 1 にします (これを$seen{$item} = 1.

項目がリスト内で再び検出された場合、unless ($seen{$item})は成功しないため、スキップされます。

于 2012-07-25T15:36:51.687 に答える
0

$seen{$item}undefined または数値のいずれかになります。

$seen{$item}++;数にします。

于 2012-07-25T15:36:41.767 に答える