在这种情况下,我们必须处理嵌套的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;
我需要你的帮助和建议来获得多个嵌套案例陈述的输出 谢谢。
答案 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"