-2

タイプのすべての前処理命令をコメントアウトしようとしています:

if LABEL
  do something
else
  do something else
end 

スクリプトに LABELS のリストを提供して、対象の「if」ステートメントを含む行と、ステートメントの「else」部分の下にあるすべてのコードのみをコメントアウトするようにする必要があります (存在する場合、または存在しない場合があります)。 「その他」)。
他のタイプの前処理命令 (すべてキーワード「end」で終わる) が存在する可能性があることに注意してください。これにより、複数レベルのネストがある場合に困難が増します。そのため、各「if LABEL_OF_INTEREST」に関連付けられている正しい else/end を確実に削除する必要があります。
行をコメントアウトするには、# を使用します。

わかりやすくするために、「if」ステートメント内のコードのみを保持する必要があり、残りはコメントアウトする必要がある例を見てみましょう。入力は次のとおりです。

if STATEMENT_TO_KEEP  
   do somthing useful  
   do somthing else useful  
   while A < 1
      if STATEMENT_TO_IGNORE  
          do somthing useful  
          do somthing else useful  
      else  
          do nothing  
          do nothing  
      end  
   end
else  
   do nothing  
   do nothing        
end  
if STATEMENT_TO_KEEP  
   do somthing useful  
   do somthing else useful
end     

期待される結果は次のようになります。

 #if STATEMENT_TO_KEEP  
   do somthing useful  
   do somthing else useful  
   while A < 1
      if STATEMENT_TO_IGNORE  
          do somthing useful  
          do somthing else useful  
      else  
          do nothing  
          do nothing  
      end  
   end
  #else  
  #   do nothing  
  #   do nothing        
  #end 
#if STATEMENT_TO_KEEP  
   do somthing useful  
   do somthing else useful
#end 
4

1 に答える 1

3
use strict;
use warnings;

my $state = 0;                       # print out when this is 0
while (<>) {
  if (!s/^(\s*if)/#$1/) {            # when you find and if, comment out
    if (!$state and /^\s*else/) {    # turn off printing from else blocks
      $state = 1;
      s/^/#/;                        # and comment out 'else'
    }   
    if ($state) {
      s/^/#/;                        # check flag, and comment out if set
      if (/^\s*end\s*$/) {
        $state = 0;                  # clear flag upon an end
      }   
    }   
  }
  print;                             # actual print
}
于 2012-12-11T06:17:13.417 に答える