未加引号的单词在 Perl 中似乎有很多含义。
print STDERR $msg;
$hash{key}
func( param => $arg )
my $x = str;
如何确定这些的含义?
下图显示了 Perl 如何按优先级降序解析标识符。
它也适用于由以下链接的标识符::
(我将其称为“限定标识符”)除非另有说明。
-
当语法预期时,语法定义的含义。
sub foo { } # «foo» («sub» is covered later)
sub main::foo { } # «main::foo» («sub» is covered later)
method Class # «Class» («method» is covered later)
method Some::Class # «Some::Class» («method» is covered later)
$foo
$main::foo
//i
=head
<<FOO
Class::
Some::Class::
LABEL:
-
字符串文字,当后面跟着一个=>
或者当整个哈希索引表达式时。
这不适用于合格的标识符。
my %h = ( a => 1 );
$h{a}
-
整个取消引用表达式时的变量名称。
${foo}
${main::foo}
请注意,使用关键字的名称、命名运算符或声明的 sub 将导致ambiguous use
警告。
-
Keyword.
while (1) { }
sub { }
use
__END__
-
当先前导入的子名称时,子调用。
use Time::HiRes qw( time );
time
main::time
-
调用命名列表运算符、命名一元运算符或命名空运算符。
print $x, $y, $z;
$c = chr $i;
$t = time;
$t = CORE::time;
-
标签,当用作操作数时next
, last
, redo
or goto
.
被视为标签的限定标识符会导致编译错误,因为标签不能是限定标识符。
next LABEL;
-
当先前声明的子或常量的名称时,子调用或内联常量。
sub foo { }
foo # Calls sub «foo»
main::foo # Calls sub «foo»
sub bar;
bar # Calls sub «bar»
use constant FOO => 123;
FOO # Replaced with the value of the constant.
-
间接方法调用,当后跟可能限定的标识符时,可能限定的标识符后缀为::
、标量(包括数组元素或散列元素)或块。
method Class # Calls method «method» («Class» is covered earlier)
method Some::Class # Calls method «method» («Some::Class» is covered earlier)
method Class:: # Calls method «method» («Class» is covered earlier)
method Some::Class:: # Calls method «method» («Some::Class» is covered earlier)
method $o # Calls method «method»
method { $o } # Calls method «method»
Base::method Class # Calls method «Base::method» («Class» is covered earlier)
您可以使用no indirect https://metacpan.org/pod/indirect当以这种方式解析代码时发出警告的杂注。
-
Glob,当用作需要文件句柄的运算符的操作数时。
open(FH, '>', $qfn) or die $!; # Equivalent to open(*FH, ...) or ...;
print FH "Hello, World!\n"; # Equivalent to print *FH ...;
print main::FH "Hello, World!\n"; # Equivalent to print *main::FH ...;
-
字符串文字,在以下情况下:
-
当用作直接方法调用的调用者时。
Class->method(@args) # Uses the string «Class» as the invocant.
Some::Class->method(@args) # Uses the string «Some::Class» as the invocant.
-
用作一元减号的操作数时。
-foo
-foo::bar
-
当用作原型为的子参数的参数时*
.
sub myprint(*@);
myprint(FH, "Hello, World\n");
myprint(main::FH, "Hello, World\n");
-
字符串字面量。这是不允许的use strict qw( subs );
.
希望我没有错过任何一个。
感谢@mosvy、@Grinnz 和@stevesliva!每个人都揭露了一些我错过的案件。
目前失踪:
-
funcname
in sort funcname
.
-
BEGIN
和类似的。它们有时充当关键字,有时充当声明的子项。
-
导入子名称print
不遵循上述步骤。
$ perl -M5.010 -e'
use subs qw( time );
eval { time; };
say $@ =~ /Undefined sub/ ? "ok" : "bad";
'
ok
$ perl -M5.010 -e'
use subs qw( system );
eval { system; };
say $@ =~ /Undefined sub/ ? "ok" : "bad";
'
ok
$ perl -M5.010 -e'
use subs qw( print );
eval { print; };
say $@ =~ /Undefined sub/ ? "ok" : "bad";
'
bad
我不知道这个有什么特别之处,也不知道是否还有其他的。我猜是因为print
没有原型,但是system
也没有原型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)