2010-04-20 10 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 –

+1

'chop ($ _)'은'$ _'의 마지막 문자를 평가합니다. 아마'map {chop; $ _ => undef} @ data' – mob

답변

2
펄 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를 사용하고, 초기을 제거 ... 작동합니다을 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;

는, 일반적으로, 당신은 더 지능적인 CRLF 제거 할 chomp 대신 chop의 사용을 고려해야합니다 : 당신은 아마도 이런 걸 원하는

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

+0

답해 주셔서 감사합니다. – ablimit

2

귀하의 문제는 고기가 아니라 결과 문자열 다진 문자를 반환합니다, 그래서 당신은 줄 바꿈에 대한 단일 항목으로 해시를 만드는 것입니다. Data :: Dumper를 사용하여 결과 해시를 출력하는 경우 디버깅에서 분명합니다.

대신을 시도해보십시오

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

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

이 사람은 정확히 특정 문제, 하지만 만약 일치하지 않을 수 있습니다 당신의 정수가 일 필요가 있습니다. 심지어 좋은 이전의 "정식"펄 접근법을 사용할 수도 있습니다 :

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

의 중복에 정말 가까운
관련 문제