【发布时间】:2016-11-27 17:00:24
【问题描述】:
在 Perl 中,文件句柄是一种数据类型,我希望这种类型的变量具有某种 sigil 前缀。但是,下面的代码(第 2 次打开)表明情况并非如此
open my $fileHandle, '>', "out.txt";
open FH, '>', "out2.txt";
我发现第二种形式令人困惑/不一致。允许第二种形式的原因是什么?
【问题讨论】:
标签: perl variables filehandle
在 Perl 中,文件句柄是一种数据类型,我希望这种类型的变量具有某种 sigil 前缀。但是,下面的代码(第 2 次打开)表明情况并非如此
open my $fileHandle, '>', "out.txt";
open FH, '>', "out2.txt";
我发现第二种形式令人困惑/不一致。允许第二种形式的原因是什么?
【问题讨论】:
标签: perl variables filehandle
允许使用第二种形式,因为它是原始形式。您过去只能通过包含它们的 glob 的名称来引用文件句柄。现在,文件句柄可以是 glob 的名称或对包裹在文件句柄对象周围的 glob 的引用或对文件句柄对象的引用。后两者可以存储在标量中(因此可以在词法范围内)。
您应该避免在新代码中使用 glob 作为文件句柄。
【讨论】:
*SOMEGLOB{IO} 或Symbol::geniosym());我提到它只是为了完整性。通常没有任何理由这样做,除非您正在玩弄符号表。
一般来说,在引用 glob 时确实需要一个印记。
my $fh = STDOUT; # XXX Short for: my $fh = "STDOUT";
my $fh = *STDOUT; # ok
但是,需要 glob 的函数(例如 open、print、readline aka <> 等)使其成为可选。
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, ...)。
【讨论】: