在Perl程序中轻松访问模式匹配的捕获数组

use*_*349 1 regex arrays perl

我的问题是:如何在Perl程序中轻松访问模式匹配的数组?(我知道有解决方案涉及split或/.../g,但我特别要求一种简单的方法来访问变量$ 1,$ 2,$ 3,...

(我认为应该有一个数组,类似于@ - 和@ +,但我找不到它)

这是我到目前为止(解决方案A涉及substr($ line,$ - [$ ],$ + [$ ] - $ - [$ ]),解决方案B涉及eval"\ $$ "),但我' d而是直接将变量$ 1,$ 2,$ 3作为数组访问:

use strict;
use warnings;

my $line = (join '', map { chr($_ + 64) } 1..26) x 10;

my $rstr = '';
$rstr .= '('.('.' x (rand(3) + 2)).')' for 1..rand(15) + 3;

unless ($line =~ m{\A $rstr}xms) {
    die "No match";
}

print $rstr, "\n";

for (1..$#-) {
    printf "A> %3d. -> pos%3d -%3d = '%s'\n", $_,
      $-[$_], $+[$_] - 1, substr($line, $-[$_], $+[$_] - $-[$_]);
}

print "\n";

for (1..$#-) {
    printf "B> %3d. -> pos%3d -%3d = '%s'\n", $_,
      $-[$_], $+[$_] - 1, eval "\$$_";
}
Run Code Online (Sandbox Code Playgroud)

afe*_*ter 6

在Perl中,表达式的结果可能取决于其调用上下文(例如标量上下文,或数组上下文或void上下文).如果将operator =〜的值赋给数组,则该数组将包含所需的值.

@arr = ('abcd' =~ /(.)(.)(.)(.)/);
Run Code Online (Sandbox Code Playgroud)

这里@arr将包含确切的($1, $2, $3, $4),即('a', 'b', 'c', 'd').