为什么文件句柄在 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 的函数(例如 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
What is the reason for allowing the 2nd form?
第二种形式(使用全局符号)早于 5.6 中引入的对 open(my $fh, ...)
的支持。事实上,它早于词法 (my
) 变量的存在。由于应尽可能避免使用全局变量,因此不鼓励使用 open(FH, ...)
。
在 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 的函数(例如 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
What is the reason for allowing the 2nd form?
第二种形式(使用全局符号)早于 5.6 中引入的对 open(my $fh, ...)
的支持。事实上,它早于词法 (my
) 变量的存在。由于应尽可能避免使用全局变量,因此不鼓励使用 open(FH, ...)
。