Захват групп в регулярном выражении переменной в Perl - PullRequest
3 голосов
/ 19 июля 2010

У меня есть несколько совпадений, которые мне нужно сделать, и все они используют один и тот же код, за исключением имени файла для чтения и самого регулярного выражения.Поэтому я хочу превратить совпадение в процедуру, которая просто принимает имя файла и регулярное выражение в виде строки.Когда я использую переменную для сопоставления, специальные переменные захвата перестали быть установленными.

$line =~ /(\d+)\s(\d+)\s/;

Этот код правильно устанавливает $ 1 и $ 2, но следующее оставляет их неопределенными:

$regexp = "/(\d+)\s(\d+)\s/";
$line =~ /$regexp/;

Есть идеи, как мне обойти это?

Спасибо, Джаред

Ответы [ 3 ]

7 голосов
/ 19 июля 2010

Используйте qr вместо кавычек:

$regexp = qr/(\d+)\s(\d+)\s/;
$line =~ /$regexp/;
4 голосов
/ 19 июля 2010

Заключите вашу строку в кавычки с помощью оператора perl regex qr

$regexp = qr/(\d+)\s(\d+)\s/;

Этот оператор заключает в кавычки (и, возможно, компилирует) его STRING как регулярное выражение.

См. Страницу perldoc для получения дополнительной информации: http://perldoc.perl.org/functions/qr.html

1 голос
/ 19 июля 2010

Цитируйте свою строку регулярного выражения usin qr:

my $regex = qr/(\d+)\s(\d+)\s/;
my $file =q!/path/to/file!;
foo($file, $regex);

затем в подпункте:

sub foo {
my $file = shift;
my $regex = shift;

open my $fh, '<', $file or die "can't open '$file' for reading: $!";
while (my $line=<$fh>) {
    if ($line =~ $regex) {
        # do stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...