Если вы зачистки «вложенными» комментарии, т.е .:
/* This is a comment
/* that has been re-commented */ possibly /* due to */
various modifications */
регулярное выражение не может быть лучшим решением. Особенно, если это охватывает несколько строк, как в приведенном выше примере.
Последний раз, когда я должен был сделать что-то подобное, я читал строки по одному, сохраняя количество уровней «/ *» (или независимо от того, какой разделитель был для конкретного языка) и не печатал ничего если счетчик не был на 0.
Вот пример - я заранее извиняюсь, потому что это очень плохо Perl, но это должно дать вам представление о том, по крайней мере:
use strict;
my $infile = $ARGV[0]; # File name
# Slurp up input file in an array
open (FH, "< $infile") or die "Opening: $infile";
my @INPUT_ARRAY = <FH>;
my @ARRAY;
my ($i,$j);
my $line;
# Removes all kind of comments (single-line, multi-line, nested).
# Further parsing will be carried on the stripped lines (in @ARRAY) but
# the error messaging routine will reference the original @INPUT_ARRAY
# so line fragments may contain comments.
my $commentLevel = 0;
for ($i=0; $i < @INPUT_ARRAY; $i++)
{
my @explodedLine = split(//,$INPUT_ARRAY[$i]);
my $resultLine ="";
for ($j=0; $j < @explodedLine; $j++)
{
if ($commentLevel > 0)
{
$resultLine .= " ";
}
if ($explodedLine[$j] eq "/" && $explodedLine[($j+1)] eq "*")
{
$commentLevel++;
next;
}
if ($explodedLine[$j] eq "*" && $explodedLine[($j+1)] eq "/")
{
$commentLevel--;
$j++;
next;
}
if (($commentLevel == 0) || ($explodedLine[$j] eq "\n"))
{
$resultLine .= $explodedLine[$j];
}
}
$ARRAY[$i]=join(" ",$resultLine);
}
close(FH) or die "Closing: $!";
Смотрите также http://stackoverflow.com/questions/2578671/where-can-i-find-information-about-perls-special- переменные –