1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
use strict;
use warnings 'all';
my (@prev) = ();
our ($n) = 0;
our ($suffix) = '';
our ($prefix) = '';
while (<>) {
s/^ //;
if (scalar (my (@line) = /^([A-Z]+)(\d+)([^"]+")( *)([^%"]*)(%?")$/) == 6) {
if (defined ($prev[0])
&& $line[0] eq $prev[0]
&& $line[1] == $prev[1] + 1
&& $line[2] eq $prev[2]
&& $line[5] eq $prev[5]) {
if ($line[3] eq " $prev[3]"
&& $line[4] eq $prev[4]) {
flush_prefix ();
flush_suffix ();
$n++;
} elsif ($line[3] eq $prev[3]
&& length ($line[4]) == length ($prev[4]) + 1
&& $prev[4] eq substr ($line[4], 0, length ($line[4]) - 1)) {
flush_n ();
flush_prefix ();
$suffix .= substr ($line[4], -1);
} elsif ($line[3] eq $prev[3]
&& $prev[4] eq substr ($line[4], 1)) {
flush_n ();
flush_suffix ();
$prefix .= substr ($line[4], 0, 1);
} else {
flush ();
print $_;
}
} else {
flush ();
print $_;
}
@prev = @line;
} else {
flush ();
print $_;
@prev = ();
}
}
flush ();
sub flush_suffix {
if ($suffix ne '') {
print "\$$suffix\n";
$suffix = '';
}
}
sub flush_prefix {
if ($prefix ne '') {
print "^$prefix\n";
$prefix = '';
}
}
sub flush_n {
if ($n) {
print "*$n\n";
$n = 0;
}
}
sub flush {
flush_prefix ();
flush_suffix ();
flush_n ();
}
|