Perl 为什么我不能声明一个由所有数字组成的变量名?

Perl 为什么我不能声明一个由所有数字组成的变量名?,perl,Perl,为什么我不能声明一个由所有数字组成的变量名,例如my$123 我知道$1是一个与正则表达式相关的特殊变量。但是$a也是一个与排序相关的特殊变量,我可以在代码中这样声明它: my $a; 为什么我可以这样做,但不能 my $1; 或 这记录在名为的perldoc中 Perl中的变量名可以有多种格式。通常,它们必须以字母或下划线开头,在这种情况下,它们可以任意长到251个字符的内部限制,并且可以包含字母、数字、下划线或特殊序列::或'。[……] Perl变量名也可以是一系列数字或单个标点符号或控

为什么我不能声明一个由所有数字组成的变量名,例如my$123

我知道$1是一个与正则表达式相关的特殊变量。但是$a也是一个与排序相关的特殊变量,我可以在代码中这样声明它:

my $a;
为什么我可以这样做,但不能

my $1;


这记录在名为的perldoc中

Perl中的变量名可以有多种格式。通常,它们必须以字母或下划线开头,在这种情况下,它们可以任意长到251个字符的内部限制,并且可以包含字母、数字、下划线或特殊序列::或'。[……]

Perl变量名也可以是一系列数字或单个标点符号或控制字符。这些名称都是Perl为特殊用途保留的;例如,所有数字名称用于保存正则表达式匹配后由反向引用捕获的数据。[……]

考虑到这一点,这些名称是有效的:

$a
$foo
$_
$_123
$_foo_bar_baz_
$_____
然而,这并不意味着拥有它们是有意义的


根据变量包含的内容命名变量总是一个好主意。很难猜测一个名为$99的变量可能包含什么。也许它是某物的第99个,在这种情况下,它应该是一个数组索引。或者可以是99,在这种情况下,您可以使用常量99。

使用${n},其中n>9。$a和$b不保留用于排序。在使用严格的“VAR”时,它们可以免于警告,因为它们用于排序。你可以在其他地方使用它们,尽管这通常被认为是不好的风格。打高尔夫球还是仅仅是对必须维护你的代码的家伙的极度仇恨?@tjd I只是指m/${1}1/应该消除捕获组1和组11之间的歧义,在组11中插入替换项。我不记得这是否被排除在严格的refs警告之外。+1一般来说,但特别是关于合理变量名和数组使用的注释。但是,像@2这样的数组和像%57132这样的散列是读写的。它们总是全局的,你可以使用@4,甚至是本地的@4,但是说“我的@4”并且总是在主名称空间中是错误的。正如其他人所说,除非你的心脏是黑色的,否则不要在任何代码中使用这些。
$a
$foo
$_
$_123
$_foo_bar_baz_
$_____