2010-04-20 51 views
1

我有一个文件,其中每一行是一个整数,代表一个id。我想要做的只是检查某个特定的ID是否在这个列表中。 但代码无法正常工作。即使123是该文件中的一行,它也不会告诉我它存在。我不知道为什么?帮助赞赏。如何检查一个值是否在Perl的列表中?

open (FILE, "list.txt") or die ("unable to open !"); 

    my @data=<FILE>; 

    my %lookup =map {chop($_) => undef} @data; 

    my $element= '123'; 
    if (exists $lookup{$element}) 
    { 
     print "Exists"; 
    } 

在此先感谢。

+0

非常接近的重复http://stackoverflow.com/questions/720482/how-can-i-verify-that-a-value-is-present-in -an-array-list-in-perl – 2010-04-20 21:13:36

+1

'chop($ _)'计算为'$ _'的最后一个字符。你可能想说'map {chop; $ _ => undef} @ data' – mob 2010-04-20 21:28:25

回答

2

用Perl 5.10了,你还可以使用智能匹配运营商:

my $id = get_id_to_check_for(); 
open my $fh, '<', 'list.txt' or die "unable to open list.txt: $!"; 
chomp(my @data = <$fh>); 
print "Id found!" if $id ~~ @data; 
6

你想确保你正确地做你的散列。非常过时的chop不是你想要使用的。使用chomp,而是和一次使用它的整个阵列上和您之前创建哈希:

open my $fh, '<', 'list.txt' or die "unable to open list.txt: $!"; 
chomp(my @data = <$fh>); 
my $hash = map { $_, 1 } @data; 
0

这应该工作...它在列表使用first ::的Util做了搜索,并消除了初始map(这是假设你不需要立即存储其他值的值)。在搜索该值时完成chomp;见perldoc -f chomp

use List::Util 'first'; 
open (my $fh, 'list.txt') or die 'unable to open list.txt!'; 

my @elements = <$fh>; 

my $element = '123'; 
if (first { chomp; $_ eq $element } @elements) 
{ 
    print "Exists"; 
} 
2

chop返回字符它切碎,没有什么被留下。也许你想是这样的:

my %lookup = map { substr($_,0,-1) => undef } @data;

然而,一般来说,你应该考虑使用的chomp代替chop做一个更智能的CRLF去除,所以你有这样一行结束了:

my %lookup =map {chomp; $_ => undef } @data;

+0

感谢您的回答。 – ablimit 2010-04-20 22:27:47

2

你的问题是,chop将返回字符切碎,而不是结果字符串,所以你正在创建一个单一的条目散列用于换行。如果使用Data :: Dumper输出结果散列,这在调试中将很明显。

试试这个:

my @data=<FILE>; 
chomp @data; 

my %lookup = map {$_ => undef} @data; 
0

这其中可能不完全匹配您的特定问题, 但如果你的整数需要计为 ,你甚至可以用好的 旧的“canonical”perl方法:

open my $fh, '<', 'list.txt' or die "unable to open list.txt: $!"; 

my %lookup; 
while(<$fh>) { chomp; $lookup{$_}++ } # this will count occurences if ints 

my $element = '123'; 
if(exists $lookup{$element}) { 
    print "$element $lookup{$element} times there\n" 
} 

这在某些情况下甚至可能比具有中间阵列的 解决方案更快。

问候

RBO

相关问题