与perl中的变量混淆

var*_*ara 7 perl

如果使用use strictuse warning,如果我指定my数据类型,它的工作原理; 如果我没有指定my它说错误.

use strict;
use warnings;
my $test=10;
my @arr=(10,20,30);
Run Code Online (Sandbox Code Playgroud)

如果我将数组变量名称声明为数字:

 use strict;
 use warnings;
 my @100=(10,20,30);
Run Code Online (Sandbox Code Playgroud)

然后,当我运行该程序时,它说错误:

 Can't use global @100 in "my" at number_sclar.pl line 28, near "my @100"
Run Code Online (Sandbox Code Playgroud)

如果我删除它my并运行该程序,它运行没有错误.

所以,任何人都可以告诉我为什么my数字数组变量名称不支持变量?

eri*_*ckb 9

来自perldoc perlvar:

以数字,控制字符或标点符号开头的Perl标识符不受"包"声明的影响,并且始终强制在包"main"中; 他们也免于"严格'变量'"错误. 其他一些名字也可以通过这些方式免除......


ike*_*ami 4

作为创建 $1、$2、$3、$100 等的无意副作用(用于保存正则表达式捕获的结果);@1、@2、@3、@100 等也会被创建。

然而,除了包变量之外,这些名称以及perlvar中的大多数特殊变量都不是合法名称。例如,您不能执行my $(;or sub (;Eventhough是包变量[1]$(的有效名称。

当 Perl 在 5.6 中添加词法时,允许用户变量使用这样的名称肯定会被认为是令人困惑的。事实上,我怀疑是否有人有过这个想法。

除了 Sigil 之外,词法变量必须以 [a-zA-Z_] [2]中的字符开头,后面可以跟 [a-zA-Z0-9_] [2]中的多个字符。因此,@100不是词法变量的有效名称。


笔记:

  1. >perl -e"our $(;"
    
    >perl -e"my $(;"
    Can't use global $( in "my" at -e line 1, near "my $("
    Execution of -e aborted due to compilation errors.
    
    >perl -e"sub (;"
    Prototype not terminated at -e line 1.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实际上允许更多的代码点,但它们不属于 ASCII 的字符集。为了简单起见,我只列出了 ASCII 字符集中的代码点。