我怎么能访问捕捉缓冲区在括号与量词



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

#!/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

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

对于你的例子,你可以使用如下:

s/(S+)s+(S+)s+/$1,$2,/

你说的"works"有一个错误。

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

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

所以,你正在做的是取匹配12 34的前两个字符,和匹配34的前两个字符,并用中间的逗号将它们连接起来。它的工作是巧合,而不是因为捕获组。

听起来好像你们是要我们用你们的解决方案来解决你们的问题,而不是问我们主要问题。

相关内容

  • 没有找到相关文章

最新更新