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*が、行が長くなりすぎます。うまくいかない、TLPの答えを見てください。@LAST_MATCH_END

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 })

あなたの例では、次のようなものを使用できます。

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

「動作する」というステートメントにはバグがあります。

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

正規表現一致の負の長さを常に返します。数値$-[0]$+[0]は、それぞれ文字列内の最初の一致の開始点と終了点のオフセットです。一致は 3 文字の長さであるため (この場合)、開始オフセットから終了オフセットを引いた値は常に であり-3length(-3)常に 2 です。

したがって、あなたがしているのは、 match の最初の 2 文字と、 match の最初の 2 文字を取得し、12 34それら34を途中でコンマで連結することです。キャプチャ グループによるものではなく、偶然に機能します。

主な問題について私たちに尋ねるのではなく、あなたのソリューションで抱えている問題を解決するように私たちに求めているように聞こえます.

于 2011-07-08T15:03:17.083 に答える