Мне обычно легко написать тестовую программу, чтобы проверить мои мысли. Может быть, это поможет вам понять, что делает регулярное выражение:
#! /usr/bin/env perl
use warnings;
use strict;
use feature qw(say);
for my $line (
'include_once F$G;',
'require_once F$G;',
'INCLUDE F$G;',
'include_once AF$G;',
'include_once F$G;',
) {
if ($line =~ m/((?:include|require)(?:_once)?\s*(.?\$.?);)/gi) {
say qq(Line = "$line");
say qq(\$1 = "$1");
say qq(\$2 = "$2"\n);
}
else {
say qq(Line = "$line");
say "No match!\n";
}
}
И вывод:
Line = "include_once F$G;"
$1 = "include_once F$G;"
$2 = "F$G"
Line = "require_once F$G;"
$1 = "require_once F$G;"
$2 = "F$G"
Line = "INCLUDE F$G;"
$1 = "INCLUDE F$G;"
$2 = "F$G"
Line = "include_once AF$G;"
No match!
Line = "include_once F$G;"
$1 = "include_once F$G;"
$2 = "F$G"
круглые скобки используются для захвата частей регулярного выражения - переменные $1
, $2
, $3
и т. Д. ?:
не позволяет скобкам захватывать эту часть (таким $2
вместо $4
со значением). Однако внешние скобки охватывают всю строку, несмотря на ?:
.
Похоже, что параметр g
в конце позволяет захватывать несколько строк. Однако в моих тестах это не сработало.