为什么在 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";
打印出 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
。为什么?
这是在 5.28.0 中引入并在 5.32.0 中修复的错误。
newly-addedcompile-time 优化(通常是多个)字符串连接跳过裸字检查。
为什么 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
。为什么?
这是在 5.28.0 中引入并在 5.32.0 中修复的错误。
newly-addedcompile-time 优化(通常是多个)字符串连接跳过裸字检查。