我试图将第一组存储在@a1中,将第二组存储在@a2

my $string = "abc123def456abc321def654";
my (@a1,@a2) = $string =~m/abc(\d+)def(\d+)/g;
$, = "\n";
print @a1;

结果为123 456 321 654,然后@a2为空。但是我想要结果是@a1 = 123 321; @a2 = 456 654对于这个结果,我尝试使用hash,因为要存储的键是第一个分组,而值是第二个分组,但是问题是重复项被删除了。使用单个正则表达式匹配的任何可行方法?

我在模式匹配中尝试了eval group。我从@a1获得了正确的结果,但是@a2出了错。不知道是什么问题?
my (@a1, @a2);
$string =~m/abc(\d+) (?{push @a1, $1}) def(\d+)(?{push @a2,$2 }) \G/x;
@a1结果为
1234
321
666
@a2结果为
4567
456
45
4
654
65
6
777
77
7

最佳答案

您可以这样做:

use List::Util 'pairs';
my @a12 = pairs $string =~ /abc(\d+)def(\d+)/g;
my @a1 = map $_->[0], @a12;
my @a2 = map $_->[1], @a12;

要么
use List::MoreUtils 'part';
my $i = 0;
my @part = part { $i++ % 2 } $string =~ /abc(\d+)def(\d+)/g;
my @a1 = @{ $part[0] };
my @a2 = @{ $part[1] };

或者只是跳过设置@ a1和@ a2并使用@ a12或@part中的数据。

10-05 20:49
查看更多