Я полагаюсь на несколько причудливых регулярных выражений, чтобы попытаться защититься от возможного ввода и объединить некоторые шаги. В документах по goto
предлагается last
(в вашем случае last LABEL
) в качестве альтернативы, но я надеюсь, что ОП не пострадает от моего повторения догмы, разделяемой немного. Моя версия печатается на стандартный вывод вместо изменения исходного файла, но должна быть достаточно близко. Было бы полезно напечатать некоторые ожидаемые результаты, но, надеюсь, я угадала.
Бородин закончил за несколько минут до меня, и я не увидел его публикации, что в некотором смысле является более продвинутым подходом. По предложению из того же я удалил ссылку на модуль Regexp::Common
, который, хотя и уместен, я согласен, был более чем необходим.
#!/usr/bin/env perl
use Modern::Perl;
open(my $fh, '<', 'rerun.txt') or die "Could not open rerun.txt: $!";
my %new_area;
foreach (<$fh>) {
chomp;
my ($k, $v) = split ',';
die "invalid rerun format" unless ($k =~ /^\w+$/ and $v =~ /^[\d.]+$/);
$new_area{ $k } = $v;
}
open($fh, '<', 'cell.txt') or die "Could not open cell.txt: $!";
my $area_key;
while (<$fh>) {
if ( /^\s* cell \s*\(\s*(\w+)\s*\)\s* { \s*$/x ) {
$area_key = $1;
}
elsif (/^\s* } \s*$/x) {
undef $area_key
}
elsif ( defined($area_key) and /\barea\b/ and
exists $new_area{ $area_key }
) {
s/(area\s*:\s*)[\d.]+/$1$new_area{$area_key}/
}
print;
}
ВЫВОД:
cell (a) {
area : 1
}
cell (b) {
area : 2
}
cell (c) {
area : 3
}
... etc ...