【问题标题】:Why doesn't a filehandle need a sigil in Perl?为什么文件句柄在 Perl 中不需要符号?
【发布时间】:2016-11-27 17:00:24
【问题描述】:

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

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

我发现第二种形式令人困惑/不一致。允许第二种形式的原因是什么?

【问题讨论】:

    标签: perl variables filehandle


    【解决方案1】:

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

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

    【讨论】:

    • ysth:“对包裹在文件句柄对象周围的 glob 的引用”与“对文件句柄对象的引用”有何不同?请您举出这两种情况的例子吗?
    • @Ltf4an 你必须竭尽全力获得后者(例如*SOMEGLOB{IO}Symbol::geniosym());我提到它只是为了完整性。通常没有任何理由这样做,除非您正在玩弄符号表。
    【解决方案2】:

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

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

    但是,需要 glob 的函数(例如 openprintreadline aka <> 等)使其成为可选。

    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
    

    允许第二种形式的原因是什么?

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

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      相关资源
      最近更新 更多