为什么Perl open()文档使用两种不同的FILEHANDLE样式?
documentation for the open function将open()的语法显示为:
>打开FILEHANDLE,EXPR 在示例中,它们具有正常的$-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,由于历史原因,谁会(在幕后)推断出一个赤字必须引用文件句柄; 请注意,在某些语言中,如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也会详细介绍这个主题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |