在Perl中,无引号的单词似乎有很多含义。
print STDERR $msg;
$hash{key}
func( param => $arg )
my $x = str;
Run Code Online (Sandbox Code Playgroud)
如何确定这些含义?
下表显示了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:
Run Code Online (Sandbox Code Playgroud)字符串文字,当其后跟一个=>或整个哈希索引表达式时。
这不适用于合格的标识符。
my %h = ( a => 1 );
$h{a}
Run Code Online (Sandbox Code Playgroud)关键词。
while (1) { }
sub { }
BEGIN { }
use
__END__
Run Code Online (Sandbox Code Playgroud)变量名,整个取消引用表达式时。
${foo}
${main::foo}
Run Code Online (Sandbox Code Playgroud)
请注意,使用命名运算符的名称将导致ambiguous use警告。
子调用,以前输入的子名称。
use Time::HiRes qw( time );
time
main::time
Run Code Online (Sandbox Code Playgroud)调用命名列表运算符,命名一元运算符或命名空运算符。
print $x, $y, $z;
$c = chr $i;
$t = time;
$t = CORE::time;
Run Code Online (Sandbox Code Playgroud)标签,作为操作数使用时为next,last,redo或goto。
标签不能是合格的标识符,因此它们不被这些运算符接受为操作数。
next LABEL;
Run Code Online (Sandbox Code Playgroud)间接方法调用,后跟现有的程序包名称,后缀为的标识符::或后缀为的合格标识符::。
这不适用于合格的标识符。
method Class # «method» («Class» is covered earlier)
method Some::Class # «method» («Some::Class» is covered earlier)
method Class:: # «method» («Class» is covered earlier)
method Some::Class:: # «method» («Some::Class» is covered earlier)
Run Code Online (Sandbox Code Playgroud)子调用,当先前声明的子名称。
sub foo { }
foo
main::foo
sub bar;
bar
use constant FOO => 123;
FOO
Run Code Online (Sandbox Code Playgroud)间接方法调用,后跟现有的程序包名称,后缀为的标识符::或后缀为的合格标识符::。
这仅适用于合格的标识符。
Class2::method Class # «Class2::method» («Class» is covered earlier)
Class2::method Some::Class # «Class2::method» («Some::Class» is covered earlier)
Class2::method Class:: # «Class2::method» («Class» is covered earlier)
Class2::method Some::Class:: # «Class2::method» («Some::Class» is covered earlier)
Run Code Online (Sandbox Code Playgroud)间接方法调用,后跟一个简单的标量,或者后跟一个不存在的包名。
method $class
method Nonexistent # «method» («Nonexistent» is covered earlier)
method Non::Existent # «method» («Non::Existent» is covered later)
Run Code Online (Sandbox Code Playgroud)Glob,用作期望文件句柄的运算符的操作数时。
open(FH, '>', $qfn) or die $!;
print FH "Hello, World!\n";
print main::FH "Hello, World!\n";
Run Code Online (Sandbox Code Playgroud)字符串文字,在以下情况下:
当用作直接方法调用的发起者时。
Class->method(@args) # «method»
Some::Class->method(@args) # «method»
Run Code Online (Sandbox Code Playgroud)当用作一元减的操作数时。
-foo
-foo::bar
Run Code Online (Sandbox Code Playgroud)当用作原型为的sub参数的参数时*。
sub myprint(*@);
myprint(FH, "Hello, World\n");
myprint(main::FH, "Hello, World\n");
Run Code Online (Sandbox Code Playgroud)希望我没有错过任何机会。
感谢@ mosvy,@ Grinnz和@stevesliva!每个案例都发现了我错过的一些案例。
当前缺少:
funcname在中sort funcname。