Perl中的bareword filehandle包变量?

时间:2015-01-28 10:39:14

标签: perl

遗留裸字文件句柄在全局范围内查找,它是否被解析为包变量?为什么它没有添加标点符号($)?

open FILE, 'file.txt';

2 个答案:

答案 0 :(得分:3)

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

  • $ - SCALAR
  • @ - ARRAY
  • % - HASH
  • & - 代码

其余部分由上下文确定。

如果你写

package Pack;

open FH, '<', 'file';

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

open FILE, 'file.txt'

然后您可以使用完全限定的FILE这样的main::FILE句柄阅读

while (<main::FILE>) {
  :
  :
}

答案 1 :(得分:0)

以前是Perl中的约定 - 文件句柄都是大写的,全局范围的。

这开始于STDIN(和其他标准文件流),所以你可以这样做:

while ( <STDIN> ) {
    print;
}

Perl的开放式命令支持传统&#39;开放模式,即:

open ( FILEHANDLE, ">filename.txt" );

不建议再使用它,但不能在不破坏遗留代码的情况下将其删除。

相反,你应该:

 open ( my $filehandle, ">", 'filename.txt' ) or die $!;
 print {$filehandle} "Some Text\n";

这有两个好处:

  • 你的文件句柄是词法范围的,因此你不必担心模块写入&#39; OUTPUT&#39;或类似的。
  • 因为它是词法范围的,它会在超出范围时自动关闭。
  • 3参数open避免注入攻击。