裸字形式本质上只是向后兼容的历史遗产。在新代码中使用词法变量几乎总是正确的做法。
→ 顺便说一句,$x
是一个词法标量变量,FOO
正如你所说,它被称为裸词
细节/题外话
只是为了完整性,正如@Joe_Z 在评论中指出的那样,词法文件句柄对象是“相对较新的”,作为 Perl 5.005 和 5.6 之间相当重大的重写的一部分(它们甚至在该版本号中获得了整个数量级......) .
然而,从技术上讲,bareword FOO
(或,例如STDIN
)在一个单独的命名空间中被解释为文件句柄。由于文件句柄命名空间没有符号(如$ @ % &
),因此只有两种方法可以引用该命名空间中的文件句柄:
- 您可以在某些函数的间接对象槽中引用它,例如
print
,由于历史原因,谁会(在幕后)推断裸字必须引用文件句柄;
- 你可以使用 typeglob,比如
*FOO
,它指的是“任何命名空间中碰巧绑定到符号FOO
.
请注意,在某些语言中,如 C 或 Scheme,单个符号没有类型标记,因此所有符号只能以一种方式绑定(例如,一个不能以 Cprintf
命名的变量和函数printf
......通常),而在Perl 或(例如)Common Lisp,同一个符号foo
可以绑定到许多不同的东西;区别在于 Perl 实际上要求您foo
在大多数情况下使用符号来消除“您的意思”的歧义。$foo
, @foo
= @foo[ $x .. $y]
, $foo[ $n ]
, %foo
= @foo{ $k1, $k2 }
=$foo{ $k }
等&foo
。
但是,通过使用裸词作为文件句柄,您会失去一些能力:
重要的是,为了在本地或词法上(而不是全局)绑定它们,您需要绑定每个命名空间中的每个符号,因为没有可用的印记。因此,my $foo
并且my @foo
可以存在于两个不同的暂存器(示波器)中,其中一个可能比另一个寿命长;但my *foo
会包括这两个,以及文件句柄foo
(以及可能的其他晦涩的极端情况,如format
说明符,尽管我不会发誓)。
将裸字样式的文件句柄传递给函数等也非常困难。
基本上,barewords 继承了全局作用域的所有缺点,并且没有词法变量的优点。
perldoc perldata
在Typeglobs 和 Filehandles上有一个很好的部分,它可能也更清楚地解释了这些事情。我手头没有我的副本,但我相信骆驼也会更详细地讨论这个主题。