今天我遇到一个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)
在日语中有一个逻辑的解释.(出奇!)