Добавьте содержимое вложенного оператора case к содержимому внешнего оператора case с помощью perl

#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.