在Perl中,filehandle是一种数据类型,我希望这种类型的变量有一些sigil前缀。但是,以下代码(第二次打开)表明情况并非如此
open my $fileHandle, '>', "out.txt";
open FH, '>', "out2.txt";
我发现第二种形式令人困惑/不一致。允许第二种形式的原因是什么?
答案 0 :(得分:6)
允许使用第二种形式,因为它是原始形式。您以前只能通过包含它们的glob的名称来引用文件句柄。现在,文件句柄可以是glob的名称,也可以是对文件句柄对象或文件句柄对象的引用所包含的glob的引用。后两者可以存储在标量中(因此可以在词法范围内)。
你应该避免在新代码中使用globs作为文件句柄。
答案 1 :(得分:4)
一般来说,在引用glob时需要一个sigil。
my $fh = STDOUT; # XXX Short for: my $fh = "STDOUT";
my $fh = *STDOUT; # ok
但是,期望全局(例如open
,print
,readline
又名<>
等)的函数会使其成为可选项。
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, ...)
。