Вот странная идея, которая может сработать.
use English qw<$INPLACE_EDIT $RS>;
$INPLACE_EDIT = '.bak';
local $RS = "CASE\n";
while ( <$input> ) {
print(( !/^(END)?CASE\n\z/ms or $1 ) ? $_ : $RS );
}
Идея состоит в том, что вы разбиваете свои записи не по новым строкам, а по CASE + \n
, и, таким образом, вы обрабатываете все строкимежду ENDCASE и CASE как одной записью, которую вы можете просто заменить на "CASE\n"
.
Обратите внимание, что мы просто печатаем запись, если не видим начала строки перед «ENDCASE» или «CASE», за которой следует новая строка,Таким образом, даже если мы делаем довольно хрупкое предположение, когда разбиваем записи, мы проверяем наше предположение, прежде чем изменять запись.Также, если оно соответствует "ENDCASE\n"
, тогда $1
равно 'END'
, и мы печатаем эту запись без изменений.
Однако может сломаться.Если по какой-то причине у вас есть возможность получить комментарий здесь:
ENDCASE
REPEAT ===> This prints because it ends with CASE
ENDREPEAT
CASE
Тогда будет напечатана первая строка.Таким образом, мы могли бы сделать это:
my $match = 0;
my $old_1;
while ( <$input> ) {
if ( m/^(END)?CASE\n\z/ms and not $1 ) {
print $RS;
}
else {
next if $old_1;
print;
}
$old_1 = $1;
}