使用只有3位索引的列表元素进行正则表达式替换不能像我预期的那样工作

ern*_*nix 5 regex perl

今天我遇到一个Twitter帖子告诉我另一个神秘的Perl行为.有人可以告诉我以下脚本中的第3个语句有什么问题吗?我正在寻找perldoc中相关的文档部分.

#!/usr/bin/perl

$x[1]    = "foo"; $_ = "foo"; s/$x[1]/bar/;    print "$_\n";
$x[10]   = "foo"; $_ = "foo"; s/$x[10]/bar/;   print "$_\n";
$x[100]  = "foo"; $_ = "foo"; s/$x[100]/bar/;  print "$_\n";
$x[1000] = "foo"; $_ = "foo"; s/$x[1000]/bar/; print "$_\n";

__END__
bar
bar
foo
bar
Run Code Online (Sandbox Code Playgroud)

它看起来像Perl解释器趋向于分开$x[100].

$x[100] = 'foo';
$_ = 'foo';
s/${x}[100]/bar/;
print "$_\n";
Run Code Online (Sandbox Code Playgroud)

编辑

谢谢你们.我在Camel Book中找到了一个文档,它建议与@ fred-gannet完全相同.启发式的因素是字符出现次数和括号中的修剪策略.

https://books.google.com/books?id=xx5JBSqcQzIC&lpg=PR1&pg=PA65#v=onepage&q&f=false

在搜索模式中,也经历双引号插值,存在一个不幸的模糊:/$foo[bar]/要插值为 /${foo}[bar]/(其中[bar]是正则表达式的字符类)或as /${foo[bar]}/(其中[bar]是数组@foo的下标)?如果 @foo不存在,那显然是一个字符类.如果@foo 存在,Perl会对[bar]进行很好的猜测,并且几乎总是正确的.†如果猜错了,或者你只是偏执狂,你可以强制使用大括号进行正确的插值,如前所示.即使你只是谨慎,也可能不是一个坏主意.

https://rt.perl.org/Public/Bug/Display.html?id=133027#txn-1542459

代码在S_intuit_more()中.

https://github.com/Perl/perl5/blob/823ba440369100de3f2693420a3887a645a57d28/toke.c#L4207-L4217

if (*s == '$')
    weight -= 3;
else if (isDIGIT(*s)) {
    if (s[1] != ']') {
    if (isDIGIT(s[1]) && s[2] == ']')
        weight -= 10;
    }
    else
    weight -= 100;
}
Zero(seen,256,char);
Run Code Online (Sandbox Code Playgroud)

在日语中有一个逻辑的解释.(出奇!)

https://8-p.info/perl-interpolation/

sha*_*rey 5

显然,perl在数组索引和正则表达式字符集(例如/[a-z]/)之间变得混乱.行为不一致.100至998的指数似乎受此影响.请使用脚本报告错误perlbug.

  • 仅供我参加perlbug舞蹈:https://rt.perl.org/Public/Bug/Display.html?id = 133027 (4认同)
  • 不是所有索引`111``222``333` ..`999`对于那些它将给出结果 (2认同)