使用perl在嵌套的case语句内容中添加外部case语句的内容

时间:2016-10-20 11:54:18

标签: perl

在这种情况下,我们必须处理嵌套的case语句,您可以通过查看输入文件和输出来观察它们      输入文件

case name in      
   ABSI) one="1"     
         two="2"    
    ;;    
   DEV)                 
        one="11"       
         two="22"       

           case nest in    
              kmr) three="3"
               ;;
              sug) four="4"
                   five="5"
                case next_level in

                      CAC)six="6"
                      ;;
                  esac
              ;;
            esac
      ;;

   DUL) seven="7"  
         nine="9"  
           case again in  

            NOV) six="66"
                      ten="10"
                  ;;
               esac
        ;;
esac      

**输出应该**

ABSI:one="1"  
ABSI:two="2"  
DEV:one="11"  
DEV:two="22"  
DEV:kmr:three="3"  
DEV:sug:four="4"  
DEV:sug:five="5"  
DEV:sug:CAC:six="6"  
DUL:seven="7"  
DUL:nine="9"  
DUL:NOV:six="66"  
DUL:NOV:ten="10"  

我得到了一个级别嵌套case语句的输出。首先,我将内容保存在临时文件中的第一个“case”和最后一个“esac”(与“end”相同)之间,然后运行下面给出的脚本

 open (data,"<input.txt");  
while (<data>) {  
$para1;  $para2;    
  unless (/case/../esac/){  
      if(/(.*)\)(.*)$/) {  
    $para1=$1;  
     $var=$2;         
     }  
     else  {  $var=$_; }  
print $para1.$var."\n";  
}  
   if (/case/../esac/)  {  
        if(/(.*)\)(.*)$/) {  
       $para2=$1;    
       $var=$2;         
       }  
      else  {  $var=$_; }          
print $para1.$para2.$var."\n";  
}   }  
close data;

我需要你的帮助和建议来获得多个嵌套案例陈述的输出 谢谢。

1 个答案:

答案 0 :(得分:1)

保留包含当前级别的数组。每当看到xxx)行时,将另一个级别推到其上,并在看到;;行时弹出最后一个级别。然后你只需要查找赋值语句。

这似乎适用于您的测试数据。

#!/usr/bin/perl

use strict;
use warnings;
# We use modern Perl here - specifically say()
use 5.010;

my @levels;

while (<DATA>) {
  if (/(\w+)\)/) {
    push @levels, $1;
  }
  if (/(\w+="\w+")/) {
    say join(':', @levels), ":$1";
  }
  if (/;;/) {
    pop @levels;
  }
}

__DATA__
case name in
   ABSI) one="1"
         two="2"
    ;;
   DEV)
        one="11"
         two="22"

           case nest in
              kmr) three="3"
               ;;
              sug) four="4"
                   five="5"
                case next_level in

                      CAC)six="6"
                      ;;
                  esac
              ;;
            esac
      ;;

   DUL) seven="7"
         nine="9"
           case again in

            NOV) six="66"
                      ten="10"
                  ;;
               esac
        ;;
esac

输出结果为:

ABSI:one="1"
ABSI:two="2"
DEV:one="11"
DEV:two="22"
DEV:kmr:three="3"
DEV:sug:four="4"
DEV:sug:five="5"
DEV:sug:CAC:six="6"
DUL:seven="7"
DUL:nine="9"
DUL:NOV:six="66"
DUL:NOV:ten="10"