Как пользователю Perl найти все экземпляры строк, которые соответствуют регулярному выражению? - PullRequest
8 голосов
/ 18 января 2012

Как пользователю Perl найти и напечатать все строки, которые соответствуют регулярному выражению?

Следующее находит только первое совпадение.

$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

if($text =~ m/\\?([^\.]+\.)/) {
    print "$1\n";
}

EDIT1: /g не работает

#!/usr/bin/env perl

$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

if($text =~ m/\\?([^\.]+\.)/g) {
    print "$1\n";
}

$ ./test.pl 
?Adsfsadfgaasdf.

Ответы [ 3 ]

9 голосов
/ 19 января 2012

Проблема в том, что модификатор /g не использует группы захвата для нескольких совпадений.Вам нужно либо перебрать совпадения в скалярном контексте, либо перехватить возвращенный список в контексте списка.Например:

use v5.10; # required for say()
$text="?Adsfsadfgaasdf.
?Bafadfdsaadsfadsf.
xcxvfdgfdg";

while ($text =~ /\?([^.]+\.)/g) {  # scalar context
    say $1;
}
for ($text =~ /\?[^.]+\./g) {     # list context
    say;               # match is held in $_
}

Обратите внимание, что во втором случае я пропустил парены, потому что в контексте списка возвращается полное совпадение, если паренов нет.Вы можете добавить парены, чтобы выбрать часть строки.

Ваша версия, используя if, использует скалярный контекст, который сохраняет позицию самого последнего совпадения, но не продолжается.Чтобы увидеть, что происходит:

if($text =~ m/\?([^\.]+\.)/g) {
    print "$1\n";
}
say "Rest of string: ", substr $text, pos;

pos дает позицию самого последнего совпадения.

2 голосов
/ 19 января 2012

В предыдущем ответе @TLP правильно написал, что сопоставление должно быть в контексте списка.

use Data::Dumper;

$text="?Adsfsadfgaasdf.
?Bafadfdsaa.
dsfadsf.
xcxvfdgfdg";

@arr = ($text =~ /\?([^\.]+\.)/g);

print Dumper(@arr);

Ожидаемый результат:

$VAR1 = 'Adsfsadfgaasdf.';
$VAR2 = 'Bafadfdsaa.';
0 голосов
/ 18 января 2012

Похоже, вам не хватает флага /g, который говорит Perl повторять совпадение столько раз, сколько возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...