#perl
#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;
Мне нужна ваша помощь и предложение, чтобы получить выходные данные для нескольких вложенных операторов case.
Спасибо.
Ответ №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"
Комментарии:
1. Привет, Дэйв, я получаю синтаксическую ошибку в строке 12, рядом с «сказать join».
2. я запускаю этот скрипт с помощью putty, а версия — v4.8.4.
3. Вы включили
use 5.010
строку? И какую версию Perl вы используете?4. Версия putty не очень полезная информация. Версия Perl является.
5. здесь отображается версия 5.8.4. Поэтому я использовал «использовать v5.8.4». Но я получаю синтаксическую ошибку в строке 12.