заключенные в скобки совпадения в виде массива (Perl) - PullRequest
3 голосов
/ 23 ноября 2010

Кажется, я помню, что в Perl (например, $1, $2, $3 и т. Д.) Был способ получить доступ к сопоставленным в скобках совпадениям с регулярным выражением в виде массива, но теперь я не могуНайди это.@+ и @- не являются тем, что я имею в виду.

Редактировать: Я должен добавить, что я хочу получить доступ к этому массиву внутри s/// (подстановка), например так:

s/(foo)(bar)+(baz)/mySubst(@!)/e;

(если бы @! был массив, который я ищу)

Ответы [ 4 ]

5 голосов
/ 23 ноября 2010

Мне не известно о встроенном магическом массиве, который содержит все группы в скобках, но это не мешает вам создать одну из них:

{package Match::Parens;
    sub TIEARRAY {bless []}
    sub FETCH {no strict 'refs'; ${$_[1] + 1}}
    sub FETCHSIZE {$#+}
    tie @!, __PACKAGE__;
}

sub mySubst {join ', ' => map ucfirst, @_}

my $str = 'foobarbarbaz';

$str =~ s/(foo)(bar)+(baz)/mySubst(@!)/e;

say $str;  # prints 'Foo, Bar, Baz'

Здесь мы заявляем, что Match::Parens будетбыть новой реализацией массива @! со связью.Каждый раз, когда к нему обращаются, он ищет текущее совпадение по этому индексу.Текущая реализация начинается с 0, как массивы, вы можете изменить его на 1, как $1, $2, $3 vars.

1 голос
/ 23 ноября 2010

Вы думаете о том, как он ведет себя с глобальным флагом соответствия?

@matches = /x(.+?)y/g;   # Matching against $_

Совпадения будут содержать элемент массива для каждого совпадения в строке.

Я никогда не слышал о том, чтоты тоже имеешь в виду Эта ссылка может предоставить вам некоторую информацию, которая поможет вам достичь того, что вы пытаетесь сделать.

1 голос
/ 23 ноября 2010

@ array = $ foo = ~ m / (your) (reg) (exp) /;

0 голосов
/ 23 ноября 2010

Вот обходной путь. Вы также можете получить к ним доступ в качестве ссылки.

s/(foo)(bar)+(baz)/mySubst([$1,$2,$3,$4])/e; 

Это будет хорошо работать, если вы знаете верхнюю границу соответствующих элементов. Это решение не ломается с предупреждениями.

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