2012-07-25 35 views
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"; 
} 

我的问题是如何散列从其退出的比较价值到当前的价值,即它是如何检查天气的价值已经存在或没有。如果我印刷%看到我得到一些value.how这些价值即将到来?

回答

2

如果它使得它更清晰的你,改变

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

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

第一次遇到特定的项目,所以进入if不存在作为哈希键。 if的主体在与项目相同的哈希中创建密钥。

第二个(以及第三个和......)时间遇到特定项目时,它作为密钥存在于哈希中,因此不会输入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; 
+0

Thanku iKegami !! – Maverick 2012-07-25 18:02:14

+1

@ user1202644,如果这回答您的问题,请通过检查最佳答案旁边的标记来关闭它。如果没有,请告诉我们缺少什么。欢迎来到StackOverflow! :) – ikegami 2012-07-25 18:10:13

+0

@ ikegami,但我在哪里可以找到“最佳答案”?对不起,但我找不到:( – Maverick 2012-07-26 14:35:15

0

$seen{$item}将是未定义的或数字。

$seen{$item}++;会使它成为一个数字。

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})不会成功的,所以它会被跳过。

+0

感谢Perreal这样一个很好的解释! – Maverick 2012-07-25 18:00:32

相关问题