2014-10-06 3 views
0

에 숫자를 비교 : 나는 마지막 괄호의 내용을 파일의 각 행을 읽은 다음 싶어는 괄호 안의 내용을 읽고 내가 같은 파일의 내용이 펄

(0872) "ss_current" (1 of 1) 
(0873) "ss_current_6oct" (0 of 1) 

익스플로러

(1 of 1) 
(0 of 1) 

과 같은지 확인하십시오. 즉, "of"전후의 숫자가 같은지 비교하십시오. 내 코드 :

my @cs; 
while (<$fh>) { 
    if ($_ =~ /\((.*?)\)/) { 
     my $temp = $1; 
     print $temp, "\n"; 
    } 
} 

그러나 이것은 당신의 정규식은 괄호의 첫 번째 세트를 따기입니다 0872 또는 0873

답변

0
use strict; 
use warnings; 

open my $in, '<', 'in.txt'; 

while(<$in>){ 
    chomp; 
    my ($first, $second) = /\((\d+) of (\d+)\)/; 
    print "$first of $second\n" if $first == $second; 
} 
5

로 컨텐츠를 제공합니다. 더 구체적인 확인하고 당신은 (1 of 1) 또는 (0 of 1)을 선택할 수 있습니다 : 각 줄에 괄호 한 세트 이상의 있기 때문에

while (<$fh>) { 
    # \d+ means match one or more adjacent numbers 
    # brackets capture the match in $1 and $2 
    if ($_ =~ /\((\d+) of (\d+)\)/) { 
     if ($1 == $2) { 
      # they are equal! print out the line (or do whatever) 
      # (the line is set to the special variable $_ while processing the file) 
      print "$_"; 
     } 
    } 
} 
0

귀하의 정규식 충분히 특정되지 않습니다.

backreferences을 사용하여 원하는 정확한 조건을 일치시키는 정규 표현식을 사용할 수 있습니다.

use strict; 
use warnings; 

while (<DATA>) { 
    print if /\((\d+) of \1\)/; 
} 

__DATA__ 
(0872) "ss_current" (1 of 1) 
(0873) "ss_current_6oct" (0 of 1) 

출력 : 하나는 바람직하지 않은 방법으로 문자열을 일치 방지하기 위해 경계 조건을 적용해야해야하므로이, 고급 기술의 종류이다

(0872) "ss_current" (1 of 1) 

참고. 이런 이유로, 당신이 초심자 인 경우에 나는 경보 한 외계인 사용 같이 기술을 사용하여 실제로 추천 할 것입니다.

관련 문제