>打开FILEHANDLE,EXPR
>打开FILEHANDLE,MODE,EXPR,LIST
>打开FILEHANDLE,REFERENCE
>打开FILEHANDLE
在示例中,它们具有正常的$-prefixed变量用于文件句柄的位置:
open(my $fh,"<","input.txt")
以及使用裸字的示例:
open(FOO,"|tr '[a-z]' '[A-Z]'");
一个问题是每个样式的名称是什么,在每种情况下“我正在使用__作为文件句柄”?另一个是,为什么他们开始在文档中使用open()的裸字?它似乎是后来的所有使用都不涉及正常的文件名open()s.在这些情况下,$-prefixed表单是不可接受的吗?
解决方法
→顺便说一句,$x是一个词汇标量变量,正如你所说,FOO称为赤字
详细资料/题外话
只是为了完整性,正如@Joe_Z在评论中指出的那样,词汇文件句柄对象是“相对较新的”,作为Perl 5.005和5.6之间相当重要的重写的一部分(它们甚至在该版本号中获得了整个数量级……) .
然而,从技术上讲,裸字FOO(或例如STDIN)仅在文件句柄中被解释在单独的命名空间中.由于文件句柄命名空间没有sigil(比如$@%&),因此只有两种方法可以引用该命名空间中的文件句柄:
>你可以在某些函数的间接对象槽中引用它,比如print,由于历史原因,谁会(在幕后)推断出一个赤字必须引用文件句柄;
>您可以使用类型*,类似* FOO,它指的是“任何名称空间中碰巧绑定到符号FOO的任何内容.
请注意,在某些语言中,如C或Scheme,单个符号没有类型符号,因此所有符号只能以一种方式绑定(例如,一个不能有一个名为printf的变量和一个名为printf的函数,通常在C …中),而在Perl或(例如)Common Lisp中,相同的符号foo可以绑定到许多不同的东西;区别在于Perl实际上要求你在大多数情况下使用符号来消除“你指的是哪个”. $foo,@ foo = @foo [$x .. $y],$foo [$n],%foo = @foo {$k1,$k2} = $foo {$k},& foo等.
但是,通过使用裸字作为文件句柄,您将失去一些能力:
值得注意的是,为了在本地或词汇上(而不是全局)绑定它们,您需要绑定每个命名空间中的每个符号,因为没有可用的符号.因此,我的$foo和我的@foo可以存在于两个不同的scratchpad(范围)中,其中一个可能比另一个更长;但我的* foo将包括这两个,以及文件句柄foo(以及可能的其他模糊的角落情况,如格式说明符,虽然我不会发誓).
基本上,裸字继承了全局范围的所有缺点,并且没有词法变量的优点.
perldoc perldata在Typeglobs和Filehandles上有一个很好的部分,它可能会更清楚地解释这些事情.我没有方便的副本,但我相信Camel也会详细介绍这个主题.