バグがありperl
ますが、プログラミングの問題もあります。特殊変数が設定された直後のステートメント以外では、その値に依存しないでください。それらの値をすぐに保存します。
このような問題に遭遇したときは、データを見てください。これは、キャプチャ バッファの処理に関するバグのように見える奇妙なものであることが判明しました。
use v5.10;
use feature qw(unicode_strings);
my $text = "01";
if ($text =~ m/(\d+)/g)
{
say "\$1 [$1]: ", join ' ', map { sprintf '%04X', ord } split //, $1;
say 'Text: ', join ' ', map { sprintf '%04X', ord } split //, $text;
$text = "A$1";
say "\$1 [$1]: ", join ' ', map { sprintf '%04X', ord } split //, $1;
say 'Text: ', join ' ', map { sprintf '%04X', ord } split //, $text;
}
同じ変数に割り当てる新しい文字列を実際に作成するために使用するまで、すべてが正しく見えますが$1
、その時点で値が一見消えます。割り当ての後、$1
異なることに注意してください。
% perl5.12.2 test.pl
$1 [01]: 0030 0031
Text: 0030 0031
$1 [AA]: 0041 0041
Text: 0041 0041 0000
変なところも違う。perl
文字列のオフセットを記憶するために、いくつかのトリッキーな処理を行います。v5.14 では、$1
まだ文字列の最初の 2 文字です。
% perl5.14.2 test.pl
$1 [01]: 0030 0031
Text: 0030 0031
$1 [A0]: 0041 0030
Text: 0041 0030 0031
$test
この問題は、同じステートメントでandを使用する代わりに新しい変数に代入する場合には発生しません$1
(これは完全に問題ないはずですが、「あるべき」がしばしば意味することは誰もが知っています)。特殊変数の値をすぐにキャプチャしても問題ありません。
use v5.10;
use feature qw(unicode_strings);
my $text = "01";
if ($text =~ m/(\d+)/g)
{
my $one = $1;
say "\$1 [$1]: ", join ' ', map { sprintf '%04X', ord } split //, $1;
say 'Text: ', join ' ', map { sprintf '%04X', ord } split //, $text;
$text = "A$one";
say "\$1 [$1]: ", join ' ', map { sprintf '%04X', ord } split //, $1;
say 'Text: ', join ' ', map { sprintf '%04X', ord } split //, $text;
}
現在、v5.12 でさえ正しく動作します。
$ perl5.12.2 test.pl
$1 [01]: 0030 0031
Text: 0030 0031
$1 [A0]: 0041 0030
Text: 0041 0030 0031