use strict;
my $str = '
# Time: 210607 16:27:16
# User@Host: doctime_db_usr[doctime_db_usr] @ [10.2.0.79] Id: 13021
# Query_time: 20.504504 Lock_time: 0.000233 Rows_sent: 52 Rows_examined: 13827347
SET timestamp=1623083236;
SELECT
substring( substring_index( uri, \'/\', -1 ) , 1, LENGTH(substring_index( uri, \'/\', -1 )) - 38 ) AS uri,
namespace,
method,
count(*) AS hits
FROM
user_hits
WHERE
namespace = \'hospitals\' AND
controller = \'queue\' AND
method = \'file\'
GROUP BY
substring( substring_index( uri, \'/\', -1 ) , 1, LENGTH(substring_index( uri, \'/\', -1 )) - 38 )
UNION
SELECT
uri,
namespace,
method,
count(*) AS hits
FROM
user_hits
WHERE
uri LIKE \'%export%\'
GROUP BY
method
ORDER BY hits DESC;
';
my $regex = qr/# Time:\s(?<timestamp>.*)\n#.*Id:\s(?<id>.*)\n#\sQuery_time:\s(?<duration>[\d.]*)\s.*time:\s(?<lock_time>[\d.]*)\s.*_sent:\s(?<returned>\d*)\s.*_examined:\s(?<searched>\d*)\n(?<sql>[\s\S]*)/mp;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Perl, please visit: http://perldoc.perl.org/perlre.html