2015-01-13 2 views
1
if (CONDITION_1) { 
    if (CONDITION_A) { 
     a = 1; 
    } 
} 
elsif (CONDITION_2) { 
    if (CONDITION_B) { 
     if (CONDITION_i) { 
      a = 2; 
     } 
     elsif (CONDITION_ii) { 
      a = 3; 
     } 
     endif 
    } 
    endif 
} 
endif 

내가 문자열로 출력 조건을 추출하고, 같은 자신의 수준에 따라 그들을 밖으로 인쇄 할 : 나는 펄에서 재귀를 코딩하는 방법추출 IF-ELSIF 자신의 수준에 따라 조건

CONDITION_1 
CONDITION_1//CONDITION_A 
CONDITION_2 
CONDITION_2//CONDITION_B 
CONDITION_2//CONDITION_B//CONDITION_i 
CONDITION_2//CONDITION_B//CONDITION_ii 

실제 파일에는 3 단계 이상의 if-else 블록이있을 수 있습니다. 나는 논리를 올바로 맞출 수 없다. 많은 감사합니다.

my (%cond, $lvl); 
open my $fh, '<', $file or die; 
while (<$fh>) { 
    if (/if\s\((\w+)\)/) { 
     $lvl++; 
     push @{ $cond{$lvl} }, $1; 
     for my $i (1 .. $lvl) { 
      print "${ $cond{$i} }[-1]"; 
      print "//" if $i != $lvl; 
     } 
     print "\n"; 
    } 
    elsif (/elsif\s\((\w+)\)/) { 
     push @{ $cond{$lvl} }, $1; 
     for my $i (1 .. $lvl) { 
      print "${ $cond{$i} }[-1]"; 
      print "//" if $i != $lvl; 
     } 
     print "\n"; 
    } 
    elsif (/else/) { 
     push @{ $cond{$lvl} }, 'else'; 
     for my $i (1 .. $lvl) { 
      print "${ $cond{$i} }[-1]"; 
      print "//" if $i != $lvl; 
     } 
     print "\n"; 
    } 
    elsif (/endif/) { 
     $lvl--; 
    } 
} 
close $fh; 
+0

"무언가"무엇입니까? 이 작업을 안정적으로 수행하려면 원하는 작업뿐만 아니라 모든 작업을 분석 할 수 있어야합니다. – ysth

+0

그들은'define CONSTANT 3'과 같은 정의의 선언입니다. 그러나 if 블록의 내용은 조건을 추출하기 만하면되므로 중요하지 않습니다. 미안합니다. –

+0

은 들여 쓰기가 항상 절대적으로 일치합니까? 탭이 아닌 항상 공백을 넣으시겠습니까? – ysth

답변

0

:

은 ---------- 나는 그 뒤에 논리를 알아 낸

EDIT ---------- 여기 내 작업 코드입니다 이것은 완전히 테스트되지 않은 코드이지만 "if-elsif-endif"샘플 구문을 사용하여 상황에 대한 나의 스핀이 될 것입니다. 레벨이 독립적 인 상태

#!/usr/bin/perl 

use warnings; 
use strict; 

my $in = "if-elsif-endif_feed"; 
my $out = "if-elsif-endif_parsed"; 

my $level; 
my $condition; 
my @levels; 
my @conditions; 

open IN, "<", $in or die "IN: $!\n"; 
open OUT, ">", $out or die "OUT: $!\n"; 

while (<IN>) { 
    if ($_ =~ m/^[elsif].*$/i) { 
     if ($_ =~ m/endif/i) { 
      next; 
     } else { 
      $level = 1; 
      ($condition) = $_ =~ m/[elsif].*\((.*)\).*$/; 
      push @levels, $level; 
      push @conditions, $condition; 
     } 
    } elsif ($_ =~ m/^\s+[elsif].*$/i) { 
     if ($_ =~ m/endif/i) { 
      next; 
     } else { 
      $level++; 
      ($condition) = m/\s+[elsif].*\((.*)\).*$/; 
      push @levels, $level; 
      push @conditions, $condition; 
     } 
    } elsif ($_ =~ m/\s+\}.*$/) { 
     $condition = "end"; 
     push @levels, $level; 
     push @conditions, $condition; 
     $level--; 
    } elsif ($_ =~ m/\}.*$/) { 
     $condition = "end"; 
     $level = 1; 
     push @levels, $level; 
     push @conditions, $condition; 
    } else { 
     next; 
    } 
} 

my $numlevels = @levels; 
my $i; 
my $curlevel; 
my $curcond; 
my $string; 
my $stringc; 

for ($i = 0; $i <= $numlevels; $i++) { 
    $curlevel = $levels[$i]; 
    $curcond = $conditions[$i]; 


    if ($curlevel == 1) { 
     if ($curcond ne "end") { 
      $string = "$curcond"; 
      print "$string\n"; 
      print OUT "$string\n"; 
     } else { 
      $string = undef; 
     } 
    } elsif ($curlevel > 1) { 
     if ($curcond ne "end") { 
      $stringc = $string; 
      if (($levels[++$i] == $curlevel) && ($conditions[++$i] eq "end")) { 
       $string .= "\/\/$curcond"; 
       print "$string\n"; 
      } elsif (($levels[++$i] == $curlevel) && ($conditions[++$i] ne "end")) { 
       $string = $stringc; 
      } 
     } elsif ($curcond eq "end") { 
      print "$string\n"; 
      print OUT "$string\n"; 
     } 
    } 
} 

그래서 첫 부분에서, 당신은 기본적으로 파일을 통해 반복 및 배열에 수준과 상태 정보를 캡처하고 있습니다 : 나는 그것이 바로,하지만 일부 디바이스 및 디버깅 시간을 필요 개념적으로 생각 공백 수를 나타냅니다. 그들, 당신은 적절한 문자열로 배열을 파싱하고 적절한 장소에 그들을 인쇄하고 있습니다.

희망하는 것이 도움이됩니다!

+0

왜 투표가 늦습니까? 나 멀리 떨어져 있니? 내 대답에 투표해야 할 필요성을 느낀다면 적어도 의견을 남겨주세요 ... – TheJester1977

+0

미안하지만, 그것은 정말로 당신을 downvoted 날 아니에요. 나는 그것을 upvoted했다. 어쨌든 귀하의 답변 주셔서 감사합니다, 나는 몇 가지 아이디어를 참조로 사용했습니다 =) –

+0

감사합니다, coff_ee, 고맙습니다. 나는 그것이 적어도 다소 도움이 되었기를 바란다! :) – TheJester1977

관련 문제