首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪一个是好的实践,一个词法文件句柄还是一个typeglob?

哪一个是好的实践,一个词法文件句柄还是一个typeglob?
EN

Stack Overflow用户
提问于 2010-07-19 02:17:12
回答 3查看 5.3K关注 0票数 15

有人说我们应该使用词法文件句柄而不是typeglob,就像这样:

代码语言:javascript
复制
open $fh, $filename;

但是大多数Perl书籍,包括The Llama Book,都使用typeglob,如下所示:

代码语言:javascript
复制
open LOGFILE, $filename;

那么有什么不同呢?哪一种被认为是更好的实践?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-19 02:21:57

词法文件句柄可以很容易地作为参数传递,而文件句柄则不能。Typeglobs可以(或者至少对它们的引用可以),但这有点混乱。考虑坚持使用词法变量,并确保首先声明它们,这样您就知道它们是真正的词法变量,而不是局部或全局变量。也就是说。

代码语言:javascript
复制
my $fh;
open $fh, $filename;

还可以考虑使用IO::HandleIO::File作为选项。以前是FileHandle,但下面的ysth告诉我,FileHandle现在只需要依次使用'IO::Handle‘,这对我来说是自5.6以来的新事物,但这里有很多需要学习的地方。:-)

另外,别忘了use strict :-)

票数 8
EN

Stack Overflow用户

发布于 2010-07-19 02:33:04

当使用词法变量时,文件句柄具有这些变量的作用域,并在您离开该作用域时自动关闭:

代码语言:javascript
复制
{
   open my $fh, '<', 'file' or die $!;
   # ...
   # the fh is closed upon leaving the scope
}

因此,您不会创建永久全局变量。

票数 15
EN

Stack Overflow用户

发布于 2015-07-01 20:35:01

不推荐使用typeglob文件句柄,因为如果您不注意,这可能会导致几个问题。例如:如果你正在创建一个重复使用同一个typeglob的递归函数,那么当你试图关闭文件句柄时,你会得到一些警告,除非你创建了一个时间受限的基于包的glob。词法变量的作用域是定义它们的块,而typeglob作用域是定义它的整个包的作用域。

要恢复,请执行以下操作:

如果你想继续使用typeglob文件句柄,一定要创建一个时间受限的基于包的glob:

代码语言:javascript
复制
...
local *FH;
open FH, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...

否则,使用词法变量

代码语言:javascript
复制
...
open my $fh, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3276674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档