为什么在 Perl 中连接运算符后面的裸词是字符串?

Why is a bareword following the concatenation operator a string in Perl?

为什么 Perl(5.30.3 以及 no feature ':all')假设连接运算符 . 后面的裸词是字符串?例如:

use v5.30;   # or: no feature ':all'; 
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
print STDOUT $k1 . k2 . "\n";

打印出 ak2ab 是有意的),并且不会引发关于此处不允许裸词的异常。这是我的脚本中的错误,但不一定在 Perl 中。

根据 perlglossary,裸词是“足够模糊以至于在 use strict 'subs' 下被视为非法的词”。但是,由于在 k2 之前定义了一个名为 $k2 的标量,所以我认为 k2 已经足够模棱两可了。

奇怪的是,第二个裸词引发了异常:

use v5.30;   # or: no feature ':all';
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
my $k3 = 'c';
print STDOUT $k1 . k2 . k3  . "\n";

并且:

Bareword "k3" not allowed while "strict subs" in use at mwe.pl line 7.
Execution of mwe.pl aborted due to compilation errors.
不允许使用

k3,但可以使用 k2。为什么?

这是在 5.28.0 中引入并在 5.32.0 中修复的错误。

newly-addedcompile-time 优化(通常是多个)字符串连接跳过裸字检查。