2012-08-17 4 views
-3

파일 FILE1에는 _Pattern1 종료 패턴을 가진 수천 개의 행이 있습니다.perl : 패턴 일치를 기초로 한 문자열 추출

두 번째 파일에도 동일한 종료 패턴 _Pattern1을 가진 수천 개의 줄이 있습니다.

지금해야합니다

    선이 문자열을 추출하고 변수에 저장할
  • _Pattern1

    과 종료 문자열이있는 경우

  • 가 알아 라인으로

  • 읽기 FILE1 라인

  • FILE2를 열고 라인별로 읽습니다.

  • 단지 FILE2에서 읽은 라인이는 펄에서 수행되는 방법

위의 변수에 저장된 문자열을 포함하는 경우

  • 는 알아?

    EDIT2 :

    알려줘야, 인터넷 검색 및 링크를 참조의 비트와 함께 나는 내 문제를 해결, 아래에 입대했다. 다음은 코드 스 니펫입니다.

    #!/usr/bin/perl 
    use strict; 
    use warnings; 
    
    my $OriginalHeader=$ARGV[0]; ## Source file 
    my $GeneratedHeader=$ARGV[1];## File to compare against 
    my $DeltaHeader=$ARGV[2]; ## File to store misses 
    
    my $MatchingPattern="_Pos"; 
    my $FoundPattern; 
    
    open FILE1, $OriginalHeader or die $!; 
    open FILE2, $GeneratedHeader or die $!; 
    open (FILE3, ">$DeltaHeader") or die $!; 
    
    my $lineFromOriginalHeader; 
    my $lineFromGeneratedHeader; 
    my $TotalMacrosExamined = 0; 
    my $TotalMacrosMissed = 0; 
    
    while($lineFromOriginalHeader=<FILE1>) 
    { 
    if($lineFromOriginalHeader =~ /$MatchingPattern/) 
        { 
        my $index = index($lineFromOriginalHeader,$MatchingPattern); 
    
        my $BackIndex = $index; 
        my $BackIndexStart = $index; 
    
        $BackIndex = $BackIndex - 1; 
    
        ## Use this while loop to extract the substring. 
        while (1) 
        { 
         my $ExtractedChar = substr($lineFromOriginalHeader,$BackIndex,1); 
         if ($ExtractedChar =~//) 
         { 
         $FoundPattern = substr($lineFromOriginalHeader,$BackIndex + 1,$BackIndexStart + 3 - 
                           $BackIndex); 
         print "Identified $FoundPattern \n"; 
         $TotalMacrosExamined = $TotalMacrosExamined + 1; 
         ##Skip the next line 
         $lineFromOriginalHeader = <FILE1>; 
         last;  
         } 
        else 
        { 
         $BackIndex = $BackIndex - 1; 
        } 
    
        } ##while(1) 
    
    ## We now look for $FoundPattern in FILE2 
    while ($lineFromGeneratedHeader = <FILE2>) 
    { 
        if (index($lineFromGeneratedHeader,$FoundPattern)!= -1) 
        { 
        ##Pattern found. Reset file pointer and break out of while loop 
        seek FILE2,0,0; 
        last; 
        } 
        else 
        { 
        if (eof(FILE2) == 1) 
         {   
         print FILE3 "Generated header misses $FoundPattern\n"; 
         $TotalMacrosMissed = $TotalMacrosMissed + 1; 
         seek FILE2,0,0; 
         last;  
         } 
        } 
    } ##while(1) 
    
    } 
    else 
    { 
        ##NOP 
    } 
    } ##while (linefromoriginalheader) 
    
    close FILE1; 
    close FILE2; 
    close FILE3; 
    print "Total number of bitfields examined = $TotalMacrosExamined\n"; 
    print "Number of macros obsolete = $TotalMacrosMissed\n"; 
    
  • +1

    단계를 잘 설명했습니다. 펄에 익숙하지 않거나 언어에 관계없이 프로그래밍하고 있습니까? Perl을 처음 사용하는 사람이라면, 당신이 설명하는 거의 모든 것이 http://perldoc.perl.org/perlintro.html에 있습니다. 보여줄 코드가 있으면 우리는 까다로운 부분을 도울 수 있습니다. – DavidO

    +0

    그 중 하나 이상의 방법이 있습니다. 여기에는'$ perl -ne'exec q; perl; "-ne", q $ print (/\Q$.$1.q;/? "$. YES. ": $. .q \; NO \;), m 인 경우"file2 ", (. *) _ pat1; ' file1' 몇 마디 빼기 트릭을해야합니다. 나는 이것이 컴파일되는지 모르지만, 나는 그것의 모양을 좋아한다. 'exec'를 루프 터미네이터로 사용하십시오. 그리고 나는 심지어 하나의 변수에 할당 할 필요가 없다 :-) 물론 더 쉬운 방법이있다 - [무엇을 시도 했습니까?] (http://whathaveyoutried.com) – amon

    +0

    regexes를 사용할 때 우리는 * 캡처하려는 그룹을 괄호로 묶어 그룹 *을 캡처합니다. 그러면 정규식은'/ ($ MatchingPattern) /'처럼 보일 것입니다. 그룹의 내용은 다른 정규식 매치를 할 때까지 특별한 변수'$ 1'에있을 것입니다. [펄의 정규 표현식 튜토리얼] (http : //perldoc.perl.org/perlretut.html # 추출 - 일치)는 perl 정규식을 배울 때 유용 할 수 있습니다. – amon

    답변

    0

    나는 C 언어로 모든 프로그램을 프로그래밍 했으므로 아래의 perl 구문을 사용하여 인터넷 검색을하고 C 프로그램을 작성했습니다. 이것은 나를 위해 완벽하게 작동합니다. :-)

    편집 : 왜 내가 아래의 알 고안에서 줄을 건너 뛰어야하는지 명확히하기 위해서입니다. 두 번째 파일에서 검색되고 나중에 검색되는 패턴은 두 개의 연속 된 행에서 발생합니다. 따라서 첫 번째 발생이 안정적으로 감지되는 것으로 충분합니다. 또한 nitpick, 항상 패턴을 포함하는 부분 문자열이 라인의 두 번째 부분 문자열임을 보장합니다.

    예 : #DEFINE Something_Pos (일부 값) 코드 더 페를 리를 만들기에

    #!/usr/bin/perl 
    use strict; 
    use warnings; 
    
    my $OriginalHeader=$ARGV[0]; 
    my $GeneratedHeader=$ARGV[1]; 
    my $DeltaHeader=$ARGV[2]; 
    
    my $MatchingPattern="_Pos"; 
    my $FoundPattern; 
    
    open FILE1, $OriginalHeader or die $!; 
    open FILE2, $GeneratedHeader or die $!; 
    open (FILE3, ">$DeltaHeader") or die $!; 
    
    my $lineFromOriginalHeader; 
    my $lineFromGeneratedHeader; 
    my $TotalMacrosExamined = 0; 
    my $TotalMacrosMissed = 0; 
    
    while($lineFromOriginalHeader=<FILE1>) 
    { 
    if($lineFromOriginalHeader =~ /$MatchingPattern/) 
    { 
        my $index = index($lineFromOriginalHeader,$MatchingPattern); 
    
        my $BackIndex = $index; 
        my $BackIndexStart = $index; 
    
        $BackIndex = $BackIndex - 1; 
    
        ## Use this while loop to extract the substring. 
        while (1) 
        { 
        my $ExtractedChar = substr($lineFromOriginalHeader,$BackIndex,1); 
        if ($ExtractedChar =~//) 
        { 
        $FoundPattern = substr($lineFromOriginalHeader,$BackIndex + 1,$BackIndexStart + 3 - 
                           $BackIndex); 
        print "Identified $FoundPattern \n"; 
        $TotalMacrosExamined = $TotalMacrosExamined + 1; 
        ##Skip the next line 
        $lineFromOriginalHeader = <FILE1>; 
        last;  
        } 
        else 
        { 
        $BackIndex = $BackIndex - 1; 
        } 
    
    } ##while(1) 
    
    ## We now look for $FoundPattern in FILE2 
    while ($lineFromGeneratedHeader = <FILE2>) 
    { 
    ##print "Read the following line from FILE2: $lineFromGeneratedHeader\n"; 
    
        if (index($lineFromGeneratedHeader,$FoundPattern)!= -1) 
        { 
        ##Pattern found. Close the file and break out of while loop 
        seek FILE2,0,0; 
        last; 
        } 
        else 
        { 
        if (eof(FILE2) == 1) 
         {   
         print FILE3 "Generated header misses $FoundPattern\n"; 
         $TotalMacrosMissed = $TotalMacrosMissed + 1; 
         seek FILE2,0,0; 
         last;  
         } 
        } 
    } ##while(1) 
    
    } 
    else 
    { 
    
    } 
    } ##while (linefromoriginalheader) 
    
    close FILE1; 
    close FILE2; 
    close FILE3; 
    print "Total number of bitfields examined = $TotalMacrosExamined\n"; 
    print "Number of macros obsolete = $TotalMacrosMissed\n"; 
    
    +0

    이 코드는 작동하는 것처럼 보이지만이 코드를 사용하여 좀 더 Perlish가되는 대답을 추가했습니다. http://stackoverflow.com/a/12012931/468327 –

    0

    그냥 첫 번째 컷. 사실 더 많이 할 수 있었는데, $some_var이 대개 Perl에서 $SomeVar과 비교하여 사용되었지만 그다지 나지 않았습니다.

    #!/usr/bin/perl 
    use strict; 
    use warnings; 
    
    my ($OriginalHeader, $GeneratedHeader, $DeltaHeader) = @ARGV; 
    my $MatchingPattern=qr/(\S*_Pos)/; # all non-whitespace terminated by _Pos 
    
    open my $file1, '<', $OriginalHeader or die $!; 
    open my $file2, '<', $GeneratedHeader or die $!; 
    open my $file3, '>', $DeltaHeader  or die $!; 
    
    my $TotalMacrosExamined = 0; 
    my $TotalMacrosMissed = 0; 
    
    while(my $lineFromOriginalHeader=<$file1>) { 
        next unless $lineFromOriginalHeader =~ $MatchingPattern; 
        my $FoundPattern = $1; # matched string 
    
        print "Identified $FoundPattern \n"; 
        $TotalMacrosExamined++; 
    
        ##Skip the next line 
        <$file1>; 
    
        ## We now look for $FoundPattern in FILE2 
        my $match_found = 0; 
        while (my $lineFromGeneratedHeader = <$file2>) { 
        if (index($lineFromGeneratedHeader,$FoundPattern)!= -1) { 
         ##Pattern found. Close the file and break out of while loop 
         $match_found++; 
         last; 
        } 
        } 
    
        unless ($match_found) { 
        print $file3 "Generated header misses $FoundPattern\n"; 
        $TotalMacrosMissed++; 
        } 
    
        seek $file2,0,0; 
    
    } 
    
    print "Total number of bitfields examined = $TotalMacrosExamined\n"; 
    print "Number of macros obsolete = $TotalMacrosMissed\n"; 
    
    관련 문제