-2

我正在尝试注释掉该类型的所有预处理指令:

if LABEL
  do something
else
  do something else
end 

您必须向脚本提供标签列表,以便它只注释掉包含感兴趣的“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 回答