2013-02-11 2 views
-1

안녕하세요은 다음과 같습니다 텍스트가 :펄 정규식 시작

을 그리고 나는이처럼 보이는 전화 번호가 있다고 가정 할 수 있습니다 :

39349562486245 

과 파일의 항목이 보이는를 like :

1002978;ITM;39349;ITALIEN MOBIL;5;0;414;177 

Now Number의 시작 부분이 아래쪽의 것과 일치합니다. Perl에서 그 번호로 시작하는지 확인하는 방법은 무엇입니까? 그래서 나는 멀었지만 일하지 않았다.

zeile [5] 전화 번호는이다.

open(DATEIMAIN, "<$dateimainc") || die("Datei $dateimainc kann nicht geöffnet werden!"); 
    my @zeilenMAIN = <DATEIMAIN>; 


    for(my $lineNMAIN = 1; $lineNMAIN < @zeilenMAIN; $lineNMAIN++) 
     { 
      @zeileMAINC = split(/;/, $zeilenMAIN[$lineNMAIN]); 

      if ($zeile[5] =~ /^$zeileMAINC[2]/) 
      { 
       $displaynameB = $zeileMAINC[3]; 
       last; 
      } 
     } 
+1

은 아마 당신이 당신의 문제를 보여줍니다 일부 입력을 제공한다. 이 코드는 제대로 작동하므로 실제로 도움을 줄 수있는 방법은 없습니다. – TLP

+1

문제는 1)'warnings'을 사용하지 않고 2)'zeileMAINC' 번호를 추출 할 때 빈 문자열이나 undef와 일치하도록 실패했음을 짐작합니다. 경고가 표시되면 '초기화되지 않은 값 $ zeileMAINC [2] in regexp compilation ...'과 같은 오류가 발생할 수 있습니다. 디버깅하려면 Data :: Dumper 모듈을 사용하여 데이터를 인쇄하여 현재 상태를 확인하십시오. – TLP

+0

경고를 사용하고 있으며 zeileMAINC 값을 인쇄 해 보았습니다. 문제가되지 않습니다. – alexj

답변

1

빌드 문자열 접두사의 해시, 그 다음을 사용 :

use warnings; 
use strict; 

#Load the lines of input data into a hash. 
my %prefixes = map { chomp; split ';' } <DATA>; 

my @numbers = ('39349562486245','123456789'); 

#Create a single regex like /^(12345|48956|...)/ for efficiency. 
my $regex = '^(' . join('|',map{quotemeta} keys %prefixes) . ')'; 

for my $num (@numbers) 
{ 
    print "$num is $prefixes{$1}\n" if ($num =~ /$regex/); 
} 

__DATA__ 
39349;ITALIEN 
12345;FOO 
+0

내가 위와 같은 방식으로 포맷되지 않은 매우 큰 목록을 가지고 있기 때문에 나는 그것을 할 수 없다. 모든 항목을 확인해야한다. 모든 출품작에 대한 해결책이 있습니까? – alexj

+0

@alexj, 각 항목마다 무엇을 의미합니까? –

+0

이것은 기능적으로 질문에있는 코드가 의도하는 것과 동일한 일을합니다. –