裸詞形式本質上只是向後兼容的歷史傳統。使用詞法變量幾乎總是新代碼中的正確事情。
→順帶$x
是詞法標量,其中FOO
是,如你所說,稱爲裸詞
詳情/題外話
只是爲了保持完整性,如@Joe_Z中指出,註釋,詞法文件句柄對象是「相對較新的」,作爲Perl 5.005和5.6之間相當主要的重寫的一部分(它們甚至在該版本號中獲得了整個數量級的...)。
然而,在技術上,裸字FOO
(或例如STDIN
)在單獨的命名空間中被解釋爲僅用於文件句柄。由於沒有一個印記(如$ @ % &
)的文件句柄的命名空間,只有兩種方式在該命名空間來引用文件句柄:
- 你可以參考它的某些功能的間接對象插槽,如
print
,誰會(幕後)推斷,由於歷史原因,一個裸詞必須指一個文件句柄;
- 您可以使用類型球,如
*FOO
,它指的是「任何名稱空間中碰巧與符號FOO
綁定的任何內容。
注意,在一些語言如C或方案,一個符號沒有類型印記,所以所有符號只能以一種方式來約束(例如,一個不能有一個變量命名printf
和功能命名printf
在C ...一般),而在Perl或(例如)Common Lisp,相同的符號foo
可以綁定許多不同的東西;區別在於Perl在大多數情況下實際上要求您使用標識來消除「您的意思是哪個foo
」。 $foo
,@foo
= @foo[ $x .. $y]
,$foo[ $n ]
,%foo
= @foo{ $k1, $k2 }
= $foo{ $k }
,&foo
等等。
通過使用裸字作爲文件句柄,雖然你失去了一些能力:
值得注意的是,以局部或詞彙(而非全球),你需要綁定每符號在每一個命名空間,因爲它們綁定沒有可用的印記。因此,my $foo
和my @foo
可以生活在兩個不同的scratchpad(示波器)中,其中一個可能超過另一個;但my *foo
將包括這些,以及文件句柄foo
(和潛在的其他不明顯的角落案例,如format
說明符,但我不會發誓)。
將裸詞式文件句柄傳遞給函數等等也非常困難。
基本上,裸詞繼承了全局範圍的所有缺點,並且沒有詞法變量的優點。
perldoc perldata
在上有一個很好的部分Typeglobs和Filehandles這可能更清楚地解釋這些事情。我沒有我的副本,但我相信駱駝對這個主題也有更多的細節。
很好的問題,我一直都被這個語法困擾 – qwwqwwq
有點討厭以任何其他方式打開(STDOUT,「| less」)'。 – tchrist