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

n.r*_*.r. 4 perl bareword

为什么 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";
Run Code Online (Sandbox Code Playgroud)

打印出来ak2ab是有意的),并且不会引发此处不允许使用裸字的例外情况。这是我的脚本中的一个错误,但不一定是 Perl 中的错误。

根据perlglossary,裸词是指“根据 ,其含义足够模糊,被视为非法的词use strict 'subs'”。然而,由于$k2之前定义了一个名为 name 的标量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";
Run Code Online (Sandbox Code Playgroud)

和:

use v5.30;   # or: no feature ':all'; 
use strict;
use warnings;
my $k1 = 'a';
my $k2 = 'b';
print STDOUT $k1 . k2 . "\n";
Run Code Online (Sandbox Code Playgroud)

k3是不允许的,但是却k2是。为什么?

Dav*_*ell 9

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

新添加的(通常是多个)字符串连接的编译时优化跳过了裸字检查。