Использование нескольких обратных ссылок в Perl - PullRequest
0 голосов
/ 06 мая 2019

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

Я пробовал следующее:

my $string = ">abc|XYUXYU|KIOKEIK_7XNCU Happy, not-happy apple banana X ORIG=Came from trees NBMR 12345 OZ=1213379 NG=popZ AZ=2 BU=1";
$string =~ m/>(abc)|(.*)|.*ORIG=(.*)[A-Z].*NG=(.*)\s(.*)\s/;

print "First match should be 'abc'. We got: $1\n";
print "Second match should be 'XYUXYU'. We got: $2\n";
print "Third match should be 'Came from trees'. We got: $3\n";
print "Fourth match should be 'popZ'. We got: $4\n";
print "Fifth match should be 'AZ=2'. We got: $5\n";

Я хотел в качестве вывода:

First match should be 'abc'. We got: abc
Second match should be 'XYUXYU'. We got: XYUXYU
Third match should be 'Came from trees'. We got: Came from trees
Fourth match should be 'popZ'. We got: popZ
Fifth match should be 'AZ=2'. We got: AZ=2

Любая подсказка, как решить эту проблему правильно на Perl?

1 Ответ

3 голосов
/ 06 мая 2019

Вы должны выйти из |, добавив \, так как они означают чередование (a|b соответствует a или b). А для третьего матча вы должны сделать квантификатор * не жадным, добавив ?. И вам нужно немного изменить шаблон после третьей группы захвата, чтобы он соответствовал пробелу хотя бы с одним верхним символом (здесь не совсем понятно, каковы общие возможности, поскольку вы только что дали пример без дополнительных подробностей. Возможно, потребуется дополнительная адаптация. .)

#!/usr/bin/perl

use strict;
use warnings;

my $string = ">abc|XYUXYU|KIOKEIK_7XNCU Happy, not-happy apple banana X ORIG=Came from trees NBMR 12345 OZ=1213379 NG=popZ AZ=2 BU=1";
$string =~ m/>(abc)\|(.*)\|.*ORIG=(.*?)\s[A-Z]+.*NG=(.*)\s(.*)\s/;

print "First match should be 'abc'. We got: $1\n";
print "Second match should be 'XYUXYU'. We got: $2\n";
print "Third match should be 'Came from trees'. We got: $3\n";
print "Fourth match should be 'popZ'. We got: $4\n";
print "Fifth match should be 'AZ=2'. We got: $5\n";

Выход:

First match should be 'abc'. We got: abc
Second match should be 'XYUXYU'. We got: XYUXYU
Third match should be 'Came from trees'. We got: Came from trees
Fourth match should be 'popZ'. We got: popZ
Fifth match should be 'AZ=2'. We got: AZ=2
...