На самом деле это просто прямое выражение для Baz (или для / (foo.bar. |) Baz /, если вы беспокоитесь о ложных срабатываниях от some.other.Baz), но игнорируете комментарии, не так ли?
Если это так, я бы собрал движок состояний, чтобы отследить, есть ли у вас многострочный комментарий или нет. Необходимые регулярные выражения не являются чем-то особенным. Что-то вроде ( непроверенный код ):
my $in_comment;
my %matches;
my $line_num = 0;
my $full_target = 'foo.bar.Baz';
my $short_target = (split /\./, $full_target)[-1]; # segment after last . (Baz)
while (my $line = <F>) {
$line_num++;
if ($in_comment) {
next unless $line =~ m|\*/|; # ignore line unless it ends the comment
$line =~ s|.*\*/||; # delete everything prior to end of comment
} elsif ($line =~ m|/\*|) {
if ($line =~ m|\*/|) { # catch /* and */ on same line
$line =~ s|/\*.*\*/||;
} else {
$in_comment = 1;
$line =~ s|/\*.*||; # clear from start of comment to end of line
}
}
$line =~ s/\\\\.*//; # remove single-line comments
$matches{$line_num} = $line if $line =~ /$full_target| $short_target/;
}
for my $key (sort keys %matches) {
print $key, ': ', $matches{$key}, "\n";
}
Это не идеально, и состояние входа / выхода из комментария может быть испорчено вложенными многострочными комментариями или если в одной строке есть несколько многострочных комментариев, но, вероятно, этого достаточно для большинства реальных случаев.
Чтобы обойтись без движка состояний, вам нужно добавить в одну строку, удалить комментарии /.../ и разделить их на отдельные строки, а затем добавить их для - // - комментарий хитов. Но вы не сможете включить номера строк в вывод таким образом.