2013-07-08 2 views
1

파일의 일부 정보를 구문 분석하려고합니다. 파일의패턴 매칭 perl

정보 :

$name = @_; # This @_ has all the information from the file that I have shown above. 

#For matching pattern Rita_bike_house_Sha9 
($a, $b) = $name =~ /\w\d+/; 

if ($a ne "" and $b ne "") { return ($a,$b) } 
# this statement doesnot work at all as its first condition 
# before the end is not satisified. 

인가 :

Rita_bike_house_Sha9 

Rita_bike_house 

가 나는 아래의 코드를 사용하는 것을 위해 DIS

$a = Rita_bike_house and $b = Sha9, 

$a = Rita_bike_house and $b = "original" 

같은 출력을 얻을 갖고 싶어 거기에 $a에 "Rita_bike_house"를 저장하고 "Sha9"를 $b에 저장할 수있는 방법이 있습니까? 내 regexp 뭔가가없는 것 같아요. 아무것도 제안 할 수 있니?

+2

'$ 이름 = @ _'는 코드 냄새입니다. 아마 당신은 ['($ name) = @ _'] (http://stackoverflow.com/q/10031455/168657)을 의미 할 것입니다. – mob

+0

'\ w'는'_' (밑줄)과도 일치하므로보다 정확한 일치 규칙이 필요합니다. – jm666

+0

죄송합니다. 예, 그것은 ($ name) = @_; – user2498830

답변

0

아주 좋은하지 않습니다,하지만 다음 :

use strict; 
use warnings; 

while(<DATA>) { 
    chomp; 
    next if /^\s*$/; 
    my @parts = split(/_/); 
    my $b = pop @parts if $parts[$#parts] =~ /\d/; 
    $b //= '"original"'; 
    my $a = join('_', @parts); 
    print "\$a = $a and \$b = $b,\n"; 
} 

__DATA__ 
Rita_bike_house_Sha9 
Rita_bike_house 

인쇄 :

$a = Rita_bike_house and $b = Sha9, 
$a = Rita_bike_house and $b = "original", 
+0

입력 해 주셔서 감사합니다. 그러나 "$ $ 부품 [$ # 부품] = ~/\ d /;에"my $ b = pop @parts " 나는 5.014 사용을 사용할 수 없다. – user2498830

+0

제안 사항은 무엇입니까? $ part [$ # parts] = ~/\ d /; 인 경우 "my $ b = pop @parts"라는 구문을 해석하지 않는 이유는 무엇입니까? – user2498830

+0

@ user2498830 편집보기 – jm666

2

코드에서 변수 $a$b를 사용하지 마십시오. 정렬에 의해 사용되며 혼동을 일으킬 수 있습니다.

시도 :

당신이 필요로하는 패턴은 항상 'Sha9'과 유사합니다 있는지 확인하고 또한 종료 후 바로 할 욕심 일치에 표시됩니다
while(my $line = <DATA>){ 
    chomp $line; 

    if($line =~ m{ \A (\w+) _ ([^_]* \d [^_]*) \z }msx){ 
    my $first = $1; 
    my $second = $2; 
    print "\$a = $first and \$b = $second\n"; 
    }else{ 
    print "\$a = $line and \$b = \"original\"\n"; 
    } 
} 

__DATA__ 
Rita_bike_house_Sha9 
Rita_bike_house 
0

....

open FILE, "filename.txt" or die $!; 
my @data = <FILE>; 
close(<FILE>); 
#my $line = "Rita_bike_house_Sha9"; 
foreach $line (@data) 
{ 
    chomp($line); 
    if ($line =~ m/(.*?)(_([a-zA-Z]+[0-9]+))?$/) 
    { 
     $a = $1; 
     $b = $3 ? $3 : "original"; 
    } 
}