Как извлечь совпадения из оператора сопоставления Perl в переменные? - PullRequest
14 голосов
/ 02 ноября 2009

Если у меня есть оператор сопоставления, как сохранить части строк, записанные в скобках, в переменных вместо использования $1, $2 и т. Д.?

... = m/stuff (.*) stuff/;

Что идет слева?

Ответы [ 6 ]

33 голосов
/ 02 ноября 2009

Хитрость заключается в том, чтобы заставить m // работать в контексте списка с помощью назначения списка:

 ($interesting) = $string =~ m/(interesting)/g;

Это может быть аккуратно расширено, чтобы захватить больше вещей, например:

 ($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g;
8 голосов
/ 02 ноября 2009

Используйте скобочную конструкцию (...) для создания буфера захвата. Затем используйте специальные переменные $1, $2 и т. Д. Для доступа к захваченной строке.

if ( m/(interesting)/ ) {
    my $captured = $1;
}
4 голосов
/ 02 ноября 2009

Обычно вы также хотите выполнить тест, чтобы убедиться, что входная строка соответствует вашему регулярному выражению. Таким образом, вы также можете обрабатывать ошибки.

Чтобы извлечь что-то интересное, у вас также должен быть способ закрепить интересующий вас фрагмент.

Итак, в вашем примере это сначала убедится, что входная строка соответствует нашему выражению, а затем извлечет бит между двумя «скучными» битами:

$input = "boring interesting boring";
if($input =~ m/boring (.*) boring/) {
    print "The interesting bit is $1\n";
}
else {
    print "Input not correctly formatted\n";
}
2 голосов
/ 18 марта 2016

@strings идет слева и будет содержать результат, затем идет ваша входная строка $input_string. Не забудьте флаг g для сопоставления всех подстрок.

my @strings=$input_string=~m/stuff (.*) stuff/g;
2 голосов
/ 13 ноября 2009

Вы можете использовать именованные буферы захвата:

if (/ (?<key> .+? ) \s* : \s* (?<value> .+ ) /x) { 
    $hash{$+{key}} = $+{value};
}
0 голосов
/ 02 ноября 2009

$ & - строка, совпадающая с последней успешное совпадение с образцом (не считая любые спички, спрятанные в блоке или eval (), заключенный в текущий BLOCK).

#! /usr/bin/perl

use strict;
use warnings;

my $interesting;
my $string = "boring interesting boring";
$interesting = $& if $string =~ /interesting/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...