首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bareword文件句柄包在Perl中是变量吗?

bareword文件句柄包在Perl中是变量吗?
EN

Stack Overflow用户
提问于 2015-01-28 18:39:14
回答 2查看 269关注 0票数 2

遗留的bareword文件句柄在全局范围内查找,它是否被解析为包变量?为什么不在前面加上标点符号($)?

代码语言:javascript
复制
open FILE, 'file.txt';
EN

回答 2

Stack Overflow用户

发布于 2015-01-28 19:18:55

如果你查看perldoc -f ref,你会发现数据类型比识别符号更多。唯一定义的是

  • $ - SCALAR
  • @ - ARRAY
  • % - HASH
  • & - CODE

其余的由上下文标识。

如果你写

代码语言:javascript
复制
package Pack;

open FH, '<', 'file';

然后,FH将作为IO变量Pack::FH出现在Pack符号表中。它前面没有美元$,因为它是IO变量,而不是标量。如果没有前面的package语句,它将被放在默认的main命名空间中。所以在你的例子中

代码语言:javascript
复制
open FILE, 'file.txt'

然后,您可以使用完全限定的main::FILE读取FILE句柄,如下所示

代码语言:javascript
复制
while (<main::FILE>) {
  :
  :
}
票数 4
EN

Stack Overflow用户

发布于 2015-01-28 19:19:57

以前是Perl中的约定- filehandles都是大写的,并且是全局作用域。

这是从STDIN (和其他标准文件流)开始的,因此您可以这样做:

代码语言:javascript
复制
while ( <STDIN> ) {
    print;
}

Perl的open命令支持“传统”模式的打开,即:

代码语言:javascript
复制
open ( FILEHANDLE, ">filename.txt" );

我们不建议再使用它了,但是如果不破坏遗留代码,就不能删除它。

相反,你应该:

代码语言:javascript
复制
 open ( my $filehandle, ">", 'filename.txt' ) or die $!;
 print {$filehandle} "Some Text\n";

这有两个优点:

输出你的文件句柄是词法作用域的,所以你不必担心模块会写到‘

  • ’或类似的地方。
  • 因为它是词法作用域的,所以当它超出作用域时,它会自动关闭。
  • 3参数open可避免注入漏洞。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28190118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档