有人说我们应该使用词法文件句柄而不是typeglob,就像这样:
open $fh, $filename;但是大多数Perl书籍,包括The Llama Book,都使用typeglob,如下所示:
open LOGFILE, $filename;那么有什么不同呢?哪一种被认为是更好的实践?
发布于 2010-07-19 02:21:57
词法文件句柄可以很容易地作为参数传递,而文件句柄则不能。Typeglobs可以(或者至少对它们的引用可以),但这有点混乱。考虑坚持使用词法变量,并确保首先声明它们,这样您就知道它们是真正的词法变量,而不是局部或全局变量。也就是说。
my $fh;
open $fh, $filename;还可以考虑使用IO::Handle或IO::File作为选项。以前是FileHandle,但下面的ysth告诉我,FileHandle现在只需要依次使用'IO::Handle‘,这对我来说是自5.6以来的新事物,但这里有很多需要学习的地方。:-)
另外,别忘了use strict :-)
发布于 2010-07-19 02:33:04
当使用词法变量时,文件句柄具有这些变量的作用域,并在您离开该作用域时自动关闭:
{
open my $fh, '<', 'file' or die $!;
# ...
# the fh is closed upon leaving the scope
}因此,您不会创建永久全局变量。
发布于 2015-07-01 20:35:01
不推荐使用typeglob文件句柄,因为如果您不注意,这可能会导致几个问题。例如:如果你正在创建一个重复使用同一个typeglob的递归函数,那么当你试图关闭文件句柄时,你会得到一些警告,除非你创建了一个时间受限的基于包的glob。词法变量的作用域是定义它们的块,而typeglob作用域是定义它的整个包的作用域。
要恢复,请执行以下操作:
如果你想继续使用typeglob文件句柄,一定要创建一个时间受限的基于包的glob:
...
local *FH;
open FH, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...否则,使用词法变量
...
open my $fh, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...https://stackoverflow.com/questions/3276674
复制相似问题