2010-04-20 73 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

相關問題