Sco*_*ter 8 perl filehandle bareword
在示例中,它们具有正常的$ -prefixed变量用于文件句柄的位置:
open(my $fh, "<", "input.txt")
Run Code Online (Sandbox Code Playgroud)
以及使用裸字的示例:
open(FOO, "|tr '[a-z]' '[A-Z]'");
Run Code Online (Sandbox Code Playgroud)
一个问题是每个样式的名称是什么,在每种情况下"我正在使用_ _作为文件句柄"?另一种是,为什么他们开始使用裸字的open()文档中?它似乎是后来的用途都不涉及正常的文件名open().在这些情况下,$ -prefixed表单是不可接受的吗?
BRP*_*ock 21
对于向后兼容性而言,裸字形式本质上只是历史遗留物.在新代码中使用词法变量几乎总是正确的事情.
→偶然,$x是一个词法标量,其中FOO是,如你所说,称为裸词
详细资料/题外话
只是为了完整性,正如@Joe_Z在评论中指出的那样,词法文件句柄对象是"相对较新的",作为Perl 5.005和5.6之间相当重要的重写的一部分(它们甚至在该版本号中获得了整个数量级......) .
但是,从技术上讲,裸字FOO(或者,例如STDIN)仅在文件句柄中被解释在单独的命名空间中.由于$ @ % &文件句柄命名空间没有sigil(like ),因此只有两种方法可以引用该命名空间中的文件句柄:
print,由于历史原因,谁将(在幕后)推断出一个裸字必须引用文件句柄;*FOO它指的是"任何命名空间中碰巧绑定到符号的任何东西FOO.请注意,在某些语言中,如C或Scheme,单个符号没有类型符号,因此所有符号只能以一种方式绑定(例如,一个不能有一个名为变量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可以住在两个不同的暂存器(范围),其中,或许一个会超越其他; 但是my *foo包括这两个,以及文件句柄foo(以及可能的其他模糊的角落情况,如format说明符,虽然我不会发誓).
将一个裸字样式的文件句柄传递给函数等也是非常困难的.
基本上,裸字继承了全局范围的所有缺点,并且没有词法变量的优点.
perldoc perldata有一个很好的关于Typeglobs和Filehandles的部分,它可能会更清楚地解释这些事情.我没有方便的副本,但我相信Camel也会详细介绍这个主题.
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |