Perl:查找一个变量的值是否与数组匹配
问题描述:
我是一个Perl新手。我有一个代码,其中一个变量在foreach循环中加载了多个值。我想要做的只是对该变量执行一些操作,仅在该变量中包含该变量。什么是最有效的方式在perl中这样做,因为我正在处理的数据非常大。Perl:查找一个变量的值是否与数组匹配
我的问题的一个简单的例子,说我有水果的数组我想
@fruits_i_like = qw (mango banana apple);
但是我有一个foreach循环它得到水果的名称从数据文件中的$水果变量有所有不同类型的水果。我将如何挑选仅存在于我的@fruits_i_like数组中的$ fruit水果的情况?
答
您可以使用这样的哈希:
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% --
答
的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";
}
快乐黑客!
答
这实际上是查找问题。在像%fruits_i_like
(它是O(1)与数组的O(n))这样的散列中查找@fruits_i_like
的值会更快。
使用下面的操作转换数组的哈希:
“大”有多大? – Zaid 2010-10-29 11:38:54
那么我需要读的文件大约是50MB。 – sfactor 2010-10-29 11:43:16
@sfactor:那也不算太坏。 – Zaid 2010-10-29 11:54:20