【问题标题】:'Can't use an undefined value as filehandle reference' error in PerlPerl 中的“不能使用未定义的值作为文件句柄引用”错误
【发布时间】:2010-11-18 00:35:32
【问题描述】:

我在运行 perl 脚本时遇到此错误:

不能在 scr 第 44 行使用未定义的值作为文件句柄引用。

第 44 行:

open my $fh, "|-", "mail", "-s", $subject, $owner, "-c", $sendto
    or die "$0: could not start mail: $!";

一切看起来都很好。错误是什么意思?

【问题讨论】:

  • 你有没有安装过perl的古老版本,比如5.005左右?
  • 你为什么要使用 9 年前的 Perl 版本?更新您的 Perl、系统管理员或工作 :-)

标签: perl


【解决方案1】:

我认为错误信息有误。这段代码:

open my $fh, '|-', 'perl', '-v' or die "$!\n";

因错误消息而死

不能使用未定义的值作为文件句柄引用...

在 Perl 5.6.1 下,但死于

未实现管道打开的列表形式...

在 Perl 5.12.1 下(在 Win32 上)。

“列表形式”意味着将程序及其参数指定为单独的值。单值形式在两个版本上都运行:

open my $fh, '|-', 'perl -v' or die "$!\n";

【讨论】:

    【解决方案2】:

    这是一个相当古老的 perl,我猜那个版本不支持词法文件句柄,所以“打开我的 $fh”将不起作用,因为古老的 perl 会看到,基本上,open undef 因此错误信息。可能的解决方案:

    • 从青铜时代升级你的 perl。
    • 改用老式的open FH 语法。
    • 使用gensym 生成可用作文件句柄的符号。
    • 使用普通openIO::* 类之一。

    【讨论】:

    • 支持词法文件句柄:my $fh = "STDIN"当然是词法文件句柄; my $fh = do{local *FH} 也是如此。它根本不支持将先前未定义的左值参数自动激活到对类型团的引用中,该类型团被祝福到 IO::Handle 包中,并带有一个析构函数来关闭和隐藏所述句柄上的任何故障——这是另一回事。
    • 所以我正在考虑正确的领域:升级 perl 或降级代码。自从我处理 5.6 以来已经有一段时间了,我一发现就切换到IO::Handle
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多