Here's one way of doing it (Note the update at the end):
#!/usr/bin/env perl use strict; use warnings; my $text; my $match = 0; my $regex = qr/int\s+main\s*\(/; { local $/; # enable "slurp" mode $text = <DATA>; # read whole file } while ($text =~ /$regex/gms) { print "Match found on line ", scalar ( split /\n/, substr $text, 0, pos($text) ) - scalar ( split /\n/, ${^MATCH} ) + 1, "\n"; $match = 1; } print "No matches found\n" unless $match; __DATA__ /* Dummy multi-main C code */ int main(int argc, char** argv) int main(int argc, char** argv) /* END */
Output:
$ pm_multi_line_match.pl Match found on line 3 Match found on line 6
Update: As the arithmetic operators already provide a scalar context, the two calls to scalar() are redundant; so you could just write:
print "Match found on line ", split(/\n/, substr $text, 0, pos $text) - split(/\n/, ${^M +ATCH}) + 1, "\n";
-- Ken
In reply to Re: Getting the line numbers of a multi-line match
by kcott
in thread Getting the line numbers of a multi-line match
by Athanasius
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |