2010-10-29 69 views
7

我是一个Perl新手。我有一个代码,其中一个变量在foreach循环中加载了多个值。我想要做的只是对该变量执行一些操作,仅在该变量中包含该变量。什么是最有效的方式在perl中这样做,因为我正在处理的数据非常大。Perl:查找一个变量的值是否与数组匹配

我的问题的一个简单的例子,说我有水果的数组我想

@fruits_i_like = qw (mango banana apple); 

但是我有一个foreach循环它得到水果的名称从数据文件中的$水果变量有所有不同类型的水果。我将如何挑选仅存在于我的@fruits_i_like数组中的$ fruit水果的情况?

+1

“大”有多大? – Zaid 2010-10-29 11:38:54

+0

那么我需要读的文件大约是50MB。 – sfactor 2010-10-29 11:43:16

+0

@sfactor:那也不算太坏。 – Zaid 2010-10-29 11:54:20

回答

10

您可以使用这样的哈希:

my %h = map {$_ => 1 } @fruits_i_like; 
if (exists $h{$this_fruit}) { 
    # do stuff 
} 

下面是这种方式比较VS mfontani解决方案

基准
#!/usr/bin/perl 
use warnings; 
use strict; 
use Benchmark qw(:all); 

my @fruits_i_like = qw/mango banana apple/; 
my $this_fruit = 'banana'; 
my %h = map {$_ => 1 } @fruits_i_like; 
my $count = -3; 
my $r = cmpthese($count, { 
    'grep' => sub { 
     if (scalar grep $this_fruit eq $_, @fruits_i_like) { 
      # do stuff 
     } 
    }, 
    'hash' => sub { 
     if (exists $h{$this_fruit}) { 
      # do stuff 
     } 
    }, 
}); 

输出:

  Rate grep hash 
grep 1074911/s -- -76% 
hash 4392945/s 309% -- 
+1

将'sub {}'更改为'q {}'并再次运行该基准。子程序调用开销可能会更改数字太多。 – tchrist 2010-10-29 12:19:19

+3

如果你为此创建%h,它不应该成为基准的一部分吗? – 2010-10-29 12:58:47

+3

@ØyvindSkaar:我不这么认为,因为OP想要多次结果。 %h只创建一次并使用很多次。这与grep解决方案不同,grep为每种不同的水果完成。 – Toto 2010-10-29 13:46:17

11

的Perl 5.10或更高?

use strict; 
use warnings; 
use 5.10.0; 
my @fruits_i_like = qw/mango banana apple/; 
my $this_fruit = 'banana'; 
if ($this_fruit ~~ \@fruits_i_like) { 
    say "yummy, I like $this_fruit!"; 
} 

之前5.10:

use strict; 
use warnings; 
my @fruits_i_like = qw/mango banana apple/; 
my $this_fruit = 'banana'; 
if (scalar grep $this_fruit eq $_, @fruits_i_like) { 
    print "yummy, I like $this_fruit!\n"; 
} 

的缺点是整个阵列分析通过寻找匹配。这可能不是最佳选择,在这种情况下,您可以使用List::MoreUtils'any(),一旦匹配值并且不会继续通过该数组,它将返回true。

use strict; 
use warnings; 
use List::MoreUtils qw/any/; 
my @fruits_i_like = qw/mango banana apple/; 
my $this_fruit = 'banana'; 
if (any { $this_fruit eq $_ } @fruits_i_like) { 
    print "yummy, I like $this_fruit!\n"; 
} 

快乐黑客!

9

这实际上是查找问题。在像%fruits_i_like(它是O(1)与数组的O(n))这样的散列中查找@fruits_i_like的值会更快。

使用下面的操作转换数组的哈希:

​​
相关问题