为什么文件句柄不需要Perl中的sigil?

时间:2016-11-27 17:00:25

标签: perl variables filehandle

在Perl中,filehandle是一种数据类型,我希望这种类型的变量有一些sigil前缀。但是,以下代码(第二次打开)表明情况并非如此

open my $fileHandle, '>', "out.txt";
open FH, '>', "out2.txt";

我发现第二种形式令人困惑/不一致。允许第二种形式的原因是什么?

2 个答案:

答案 0 :(得分:6)

允许使用第二种形式,因为它是原始形式。您以前只能通过包含它们的glob的名称来引用文件句柄。现在,文件句柄可以是glob的名称,也可以是对文件句柄对象或文件句柄对象的引用所包含的glob的引用。后两者可以存储在标量中(因此可以在词法范围内)。

你应该避免在新代码中使用globs作为文件句柄。

答案 1 :(得分:4)

一般来说,在引用glob时需要一个sigil。

my $fh = STDOUT;    # XXX Short for: my $fh = "STDOUT";
my $fh = *STDOUT;   # ok

但是,期望全局(例如openprintreadline又名<>等)的函数会使其成为可选项。

print STDOUT "foo\n";   # Short for: print *STDOUT "foo\n";

您可以使用*原型进行近似。

sub foo { }
sub bar(*) { }

foo(STDOUT);   # XXX Fails when using "use strict;"
bar(STDOUT);   # ok
  

允许第二种形式的原因是什么?

第二种形式(使用全局符号)早于5.6中引入的open(my $fh, ...)支持。事实上,它早于词汇(my)变量的存在。由于应尽可能避免使用全局变量,因此不鼓励使用open(FH, ...)