ОК - чтобы переформулировать то, что, как я думаю, вы запрашиваете, вы хотите проанализировать файл и найти присвоения формы
foo=
{
....
}
и внутри блока вы хотите переместить комментарии в конец строки. Есть несколько способов сделать это, самый элегантный обычно связан с тем, что еще вы делаете в цикле. Единственное, что приходит на ум, - это просто вспомнить тот факт, что в последней строке содержался символ «=», и использовать этот факт при сопоставлении с «{» в начале строки. Используя одну из моих любимых конструкций perl, оператор диапазона в скалярном контексте. Так что это дало бы ...
my $last_line_an_assignment = 0;
while (<DATA>)
{
if (($last_line_an_assignment && m!^\s*{!) .. m!^\s*}!)
{
s!(/\*.*?\*/)\s*(.*)$!$2 $1!;
}
print $_;
$last_line_an_assignment = m!=!;
}
__DATA__
/* comment other */ (unsigned int a);
other_assignment=
/* not a table */ 12;
array_table=
{
/* comment 1*/ (unsigned int a);
/* comment 2*/ (unsigned int b);
/* comment 3*/ (unsigned int c);
/* comment 4*/ (unsigned int d);
}
/* comment other */ (unsigned int a);
Вы можете либо распечатать данные в другой файл, либо обновить файлы на месте, используя параметр '-i' для perl
local (@ARGV) = ($filename);
local ($^I) = '.bak';
while (<>)
{
# make changes to line AND call print
}
Это заставляет perl сделать резервную копию $ filename (с расширением '.bak'), и тогда все вызовы печати в цикле перезапишут содержимое, если файл - для получения дополнительной информации см. Опцию '-i' в Страница руководства "perlrun".