Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 词法文件句柄还是typeglob,哪一个是好的实践?_Perl - Fatal编程技术网

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

Perl 词法文件句柄还是typeglob,哪一个是好的实践?,perl,Perl,有人说我们应该使用词法文件句柄而不是typeglob,如下所示: open $fh, $filename; open LOGFILE, $filename; 但大多数Perl书籍(包括)都使用typeglob,如下所示: open $fh, $filename; open LOGFILE, $filename; 那么有什么区别呢?哪个被认为是更好的实践?词法文件句柄可以作为参数轻松传递,而文件句柄则不能。Typeglobs可以(或者至少可以引用它们),但这有点混乱。考虑使用词汇变量,并确

有人说我们应该使用词法文件句柄而不是typeglob,如下所示:

open $fh, $filename;
open LOGFILE, $filename;
但大多数Perl书籍(包括)都使用typeglob,如下所示:

open $fh, $filename;
open LOGFILE, $filename;

那么有什么区别呢?哪个被认为是更好的实践?

词法文件句柄可以作为参数轻松传递,而文件句柄则不能。Typeglobs可以(或者至少可以引用它们),但这有点混乱。考虑使用词汇变量,并确保首先声明它们,这样你就知道它们实际上是词汇的,而不是局部的或全局的。即

my $fh;
open $fh, $filename;

也可以考虑使用<代码> IO::句柄< /C>或<代码> IO:文件< /代码>作为选项。以前是

FileHandle
,但从下面得知
FileHandle
现在只依次使用'IO::Handle',这对我来说是5.6以来的新闻,但这里有很多东西要学。:-)


另外,不要忘记
使用strict
:-)

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

{
   open my $fh, '<', 'file' or die $!;
   # ...
   # the fh is closed upon leaving the scope
}
{

打开我的$fh,“Llama图书的最早版本是1993年,当时词法文件句柄还没有成为Perl语言的一部分。词法文件句柄是一种更好的实践,原因有很多。TypeGlob最重要的缺点是

  • 它们的范围始终是全局的,这可能会导致像这样的潜在错误:

    sub doSomething { my ($input) = @_; # let's compare $input to something we read from another file open(F, "<", $anotherFile); @F = <F>; close F; do_some_comparison($input, @F); } open(F, "<", $myfile); while (<F>) { doSomething($_); # do'h -- just closed the F filehandle } close F; 亚剂量测量法{ 我的($input)=@; #让我们将$input与从另一个文件读取的内容进行比较
    开放式(F,"不建议使用typeglob filehandle,因为如果您不注意,这可能会导致几个问题。例如:如果您正在创建一个重用相同typeglob的递归函数,则在尝试关闭filehandle时会收到一些警告,除非您创建一个基于glob的时间有限的包。词法变量的作用域为t定义它们的块,而typeglob作用域用于定义它们的完整包

    恢复:

    如果要继续使用typeglob filehandle,请确保创建一个基于glob的临时有限包:

    ...
    local *FH;
    open FH, '<', $filepath or die(sprintf('Could not open %s: %s', $filepath, $!));
    ...
    
    。。。
    本地*FH;
    
    OpenFH,'非常有用的解释!我读了2008年出版的《美洲驼》第五版。它仍然使用typeglobs。
    OpenMy$FH,…
    是完全合法的(事实上这是常用的习惯用语).不需要两行。@hobbs-你说得对,我只是指出它可能不是一个词法变量-它可能是一个局部变量或全局变量。@ysth:FileHandle的最新版本是什么?从5.6开始我就没有广泛使用过perl…@erucform:IO::File,IO::Handle,等等。(FileHandle本身现在使用的)可能是Perl最佳实践的副本,我建议您获得一份Perl最佳实践的副本,也许还可以获得有效的Perl编程