为什么文件句柄在 Perl 中不需要印记?

Why doesn't a filehandle need a sigil in Perl?

在 Perl 中,文件句柄是一种数据类型,我希望这种类型的变量具有某种印记前缀。然而,下面的代码(第2次打开)表明并非如此

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

我找到了第二种形式confusing/inconsistent。允许第二种形式的原因是什么?

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

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

一般来说,引用 glob 时确实需要印记。

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

但是,需要 glob 的函数(例如 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

What is the reason for allowing the 2nd form?

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