Perl如何解析未引用的裸词?

ike*_*ami 5 perl parsing

在Perl中,无引号的单词似乎有很多含义。

print STDERR $msg;

$hash{key}

func( param => $arg )

my $x = str;
Run Code Online (Sandbox Code Playgroud)

如何确定这些含义?

ike*_*ami 7

下表显示了Perl如何按优先级降序解析标识符。

::除非另有说明,否则它也适用于链接的标识符(我将其称为“合格标识符”)。

  1. 句法上预期的句法定义含义。

    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)
  2. 字符串文字,当其后跟一个=>或整个哈希索引表达式时。

    这不适用于合格的标识符。

    my %h = ( a => 1 );
    $h{a}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 关键词。

    while (1) { }
    sub { }
    BEGIN { }
    use
    __END__
    
    Run Code Online (Sandbox Code Playgroud)
  4. 变量名,整个取消引用表达式时。

    ${foo}
    ${main::foo}
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,使用命名运算符的名称将导致ambiguous use警告。

  5. 子调用,以前输入的子名称。

    use Time::HiRes qw( time );
    time
    main::time
    
    Run Code Online (Sandbox Code Playgroud)
  6. 调用命名列表运算符,命名一元运算符或命名空运算符。

    print $x, $y, $z;
    $c = chr $i;
    $t = time;
    $t = CORE::time;
    
    Run Code Online (Sandbox Code Playgroud)
  7. 标签,作为操作数使用时为nextlastredogoto

    标签不能是合格的标识符,因此它们不被这些运算符接受为操作数。

    next LABEL;
    
    Run Code Online (Sandbox Code Playgroud)
  8. 间接方法调用,后跟现有的程序包名称,后缀为的标识符::或后缀为的合格标识符::

    这不适用于合格的标识符。

    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)
  9. 子调用,当先前声明的子名称。

    sub foo { }
    foo
    main::foo
    
    sub bar;
    bar
    
    use constant FOO => 123;
    FOO
    
    Run Code Online (Sandbox Code Playgroud)
  10. 间接方法调用,后跟现有的程序包名称,后缀为的标识符::或后缀为的合格标识符::

    这仅适用于合格的标识符。

    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)
  11. 间接方法调用,后跟一个简单的标量,或者后跟一个不存在的包名。

    method $class
    method Nonexistent     # «method» («Nonexistent» is covered earlier)
    method Non::Existent   # «method» («Non::Existent» is covered later)
    
    Run Code Online (Sandbox Code Playgroud)
  12. Glob,用作期望文件句柄的运算符的操作数时。

    open(FH, '>', $qfn) or die $!;
    print FH "Hello, World!\n";
    print main::FH "Hello, World!\n";
    
    Run Code Online (Sandbox Code Playgroud)
  13. 字符串文字,在以下情况下:

希望我没有错过任何机会。

感谢@ mosvy,@ Grinnz和@stevesliva!每个案例都发现了我错过的一些案例。


当前缺少

  • funcname在中sort funcname