2013-02-11 41 views
-1

你好我有一個類似如下的文字:Perl的正則表達式開始

而且可以說我有一個看起來像這樣的電話號碼:

39349562486245 

,並在文件中的條目,看起來像這樣:

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

現在號碼的開頭用一個匹配那裏我怎麼能檢查是否在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 2013-02-11 14:13:38

+1

我猜測問題在於:1)您沒有使用'warnings',2)當您提取'zeileMAINC'編號時,它會失敗,因此您將匹配空字符串或undef。如果你有警告,你可能會得到一個錯誤,比如'在正則表達式編譯中使用未初始化值$ zeileMAINC [2] ...'爲了調試,使用Data :: Dumper模塊打印數據以查看它是什麼。 – TLP 2013-02-11 14:17:40

+0

我使用的警告,我也嘗試打印zeileMAINC的價值,這也是沒有問題的。 – alexj 2013-02-11 14:25:12

回答

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 2013-02-11 14:23:35

+0

@alexj,你是什麼意思的每一個條目? – 2013-02-11 14:28:03

+0

這在功能上與您問題中的代碼意圖做同樣的事情。 – 2013-02-11 14:43:14