2013-02-11 76 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