我似乎记得有一种方法可以将Perl中的正则表达式的括号匹配(即$1
,$2
,$3
等)作为数组进行访问,但是现在我似乎无法找到。 @+
和@-
都不是我的意思。
修改
我应该补充一点,我想在s///
(替换)中访问这个数组,如下所示:
s/(foo)(bar)+(baz)/mySubst(@!)/e;
(如果@!
是我正在寻找的数组)
答案 0 :(得分:5)
我不知道有一个内置的魔术数组,它包含所有带括号的组,但这不会阻止你制作一个:
{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
将是带有tie的@!
数组的新实现。每次访问它时,它都会在该索引处查找当前匹配项。当前的实现从0开始,就像数组一样,您可能希望将其更改为从$1, $2, $3
变量开始为1。
答案 1 :(得分:1)
@array = $ foo = ~m /(your)(reg)(exp)/;
答案 2 :(得分:1)
您是否正在考虑使用全局匹配标志的行为?
@matches = /x(.+?)y/g; # Matching against $_
匹配将包含字符串中每个匹配的数组元素。
我从未听说过你所指的是什么。 This link可能会为您提供一些信息,帮助您实现您的目标。
答案 3 :(得分:0)
这是一个解决方法。您也可以访问它们作为参考。
s/(foo)(bar)+(baz)/mySubst([$1,$2,$3,$4])/e;
如果您知道匹配元素的上限,这将很有效。这个解决方案不会出现警告。