在Perl中,为什么连接运算符后的裸字是一个字符串?

4
为什么 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";

输出结果为ak2(预期的是ab),并且没有引发关于不允许此处使用裸字的异常。虽然这是我的脚本中的错误,但不一定是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是可以的。为什么?


“prints out ak2”:使用 Perl 5.34.0,我得到了编译错误:“在使用“strict subs”的情况下不允许裸字“k2”。” - Håkon Hægland
1个回答

9

这是一个在5.28.0版本引入的bug,在5.32.0版本修复。

通常情况下,新增的编译时优化(通常有多个字符串连接)会跳过裸字检查。


Demo - ikegami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接