Следующее было бы идеально, если бы поддерживались видоискатели переменной ширины:
s/
(?<! \b long \s+)
\b long \b
(?! \s+ long \b)
/int/xg
Это оставляет вас в беспорядке:
s/
\b ( (?: long \s+ )* ) long \b
/
length($1) ? $1."long" : "int"
/xeg
Обновление : Это также работает:
s/
(?<! \b long )
(?<! \s ) \s* \K
\b long \b
(?! \s+ long \b)
/int/xg
Обновление : протестировано с использованием:
use strict;
use warnings;
use Test::More;
sub fix {
my ($s) = @_;
$s =~ s/
\b ( (?: long \s+ )* ) long \b
/
length($1) ? $1."long" : "int"
/xeg;
return $s;
}
my @tests = (
[ ' long abd;', ' int abd;' ],
[ 'int longname;', 'int longname;' ],
[ 'int reallylongname;', 'int reallylongname;' ],
[ 'float reallylong longname;', 'float reallylong longname;' ],
[ 'double namelong', 'double namelong' ],
[ 'long abc long', 'int abc int' ],
[ 'long long abc', 'long long abc' ],
[ 'long long hhhh', 'long long hhhh' ],
[ 'long long hhhh', 'long long hhhh' ],
[ 'long abd( long kjhh', 'int abd( int kjhh' ],
);
plan tests => 0+@tests;
for (@tests) {
my ($i,$e) = @$_;
my $g = fix($i);
is($g, $e, $i);
}
1;