为什么Perl open()文档使用两种不同的FILEHANDLE样式?

前端之家收集整理的这篇文章主要介绍了为什么Perl open()文档使用两种不同的FILEHANDLE样式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
documentation for the open function将open()的语法显示为:

>打开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也会详细介绍这个主题.

猜你在找的Perl相关文章