2

如何使用量词访问括号中的捕获缓冲区?

#!/usr/local/bin/perl
use warnings;
use 5.014;

my $string = '12 34 56 78 90';

say $string =~ s/(?:(\S+)\s){2}/$1,$2,/r;
# Use of uninitialized value $2 in concatenation (.) or string at ./so.pl line 7.                                                           
# 34,,56 78 90 

使用@LAST_MATCH_START并且@LAST_MATCH_END 它可以工作*,但是行变得太长。不行,看TLP的回答。

*The proof of the pudding is in the eating并不总是正确的。

say $string =~ s/(?:(\S+)\s){2}/substr( $string, $-[0], length($-[0]-$+[0]) ) . ',' . substr( $string, $-[1], length($-[1]-$+[1]) ) . ','/re;
# 12,34,56 78 90
4

2 回答 2

4

您无法访问第一个捕获组的所有先前值,只有最后一个值(或匹配结束时的当前值,如您所见)将被保存$1(除非您想使用(?{ code })hack)。

对于您的示例,您可以使用以下内容:

s/(\S+)\s+(\S+)\s+/$1,$2,/
于 2011-07-08T12:08:00.337 回答
1

您说“有效”的声明中有一个错误。

length($-[0]-$+[0]) 

将始终返回正则表达式匹配的负长度的长度。数字$-[0]$+[0]分别是字符串中第一个匹配的开始和结束的偏移量。由于匹配是三个字符长(在这种情况下),开始减去结束偏移量将始终为-3,并且length(-3)始终为 2。

因此,您所做的是获取 match12 34的前两个字符和 match 的前两个字符,34并在中间用逗号将它们连接起来。它的工作是巧合,而不是因为捕获组。

听起来好像您是在要求我们解决您在解决方案中遇到的问题,而不是向我们询问主要问题。

于 2011-07-08T15:03:17.083 回答