8

如果使用use strictanduse warning如果我指定my数据类型,它可以工作;如果我没有指定my它会说错误。

use strict;
use warnings;
my $test=10;
my @arr=(10,20,30);

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

 use strict;
 use warnings;
 my @100=(10,20,30);

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

 Can't use global @100 in "my" at number_sclar.pl line 28, near "my @100"

如果我删除它my并运行该程序,它会运行而不会出现错误。

那么请谁能告诉我为什么my数字数组变量名不支持变量?

4

2 回答 2

9

来自perldoc perlvar

以数字、控制字符或标点字符开头的 Perl 标识符不受“包”声明的影响,并且总是强制在包“main”中;它们也免于“严格的'vars'”错误。 其他一些名称也可以通过这些方式获得豁免...

于 2013-05-16T05:39:54.873 回答
4

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

然而,这些和perlvar中的大多数特殊变量的名称不是合法的名称,除了包变量。例如,你不能做my $(;或者sub (;即使$(是包变量[1]的有效名称。

当在 5.6 中将词法添加到 Perl 时,允许用户变量使用这样的名称肯定会让人感到困惑。事实上,我怀疑是否有人会接受这个想法。

撇开印记不谈,词法变量必须以 [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.
    
  2. 实际上允许更多的代码点,但它们不属于 ASCII 的字符集。为简单起见,我只列出了 ASCII 字符集中的代码点。

于 2013-05-16T06:10:01.130 回答