在范围“no autodie”之后,程序在“*STDOUT”处终止

2024-03-08

这个节目

use warnings;
use strict;
use feature qw(say);

{
    #use autodie;   # all good when this is uncommented
    no autodie;
}

open my $OLDSTD, '>&', *STDOUT;        #--> line 10 (program fails)
open *STDOUT, '>', 'stdout.out';

say "$$ done";

中止与



Undefined subroutine called at problem_no_autodie.pl line 10.
  

重述代码中的注释:如果有use autodie;先声明然后一切都好。 (一切都很好,只有use autodie;)奇怪的是,在相同的范围内no autodie声明我也没有看到这样的问题;只有超出其范围的代码才会失败!有点反作用域,是吗?

如果这个范围no autodie comes after指某东西的用途*STDOUT然后一切又好了。进一步利用*STDOUT,之后(范围)no autodie,程序失败。

有一个Gotcha https://perldoc.perl.org/autodie.html#GOTCHAS在涉及裸字的文档中提到(我不完全理解),并且该程序确实失败了STDOUT——但我把它当作*STDOUT.

所以看来*STDOUT被视为用户的子目录,但我不明白这一点,也不明白其范围如何autodie被击败。 (范围泄漏在某些版本中被称为错误,但以看似无关的方式。)这有一个实际问题。

我不使用autodie在我的代码中。但考虑一下我确实使用的这个子

sub isatty {
    no autodie;
    state $isatty = open(my $tty, '+<', '/dev/tty');
    return $isatty;
}

这是合法的open失败,所以我们必须禁用autodie在该范围内,以防潜艇的用户打开它。那么所描述的行为会造成伤害吗?什么情况下?

我对这个效果感到困惑no autodie以及它超出其范围的泄漏,以及所有奇怪的细节。但真正关心的是,我不确定如何保护使用像上面这样的库的代码免受这种行为的影响,因为我不理解它。有任何想法吗?

我在 CentOS 7.8 上的 5.16.3(系统)、5.26.2 和 5.30.0(perlbrew)下看到了这个

I do not在 5.32.0 上看到此行为;那里没有失败。


The ... or die $!检查与open没有任何区别,因此为了简单起见没有显示。


This bug https://github.com/pjf/autodie/issues/69在 autodie 2.24 中引入并在 autodie 2.30 中修复。

$ ( cd ./autodie-2.23; perl Makefile.PL >&3; make >&3; perl -Mblib ../a.pl && echo ok ) 3>/dev/null
ok

$ ( cd ./autodie-2.24; perl Makefile.PL >&3; make >&3; perl -Mblib ../a.pl && echo ok ) 3>/dev/null
Undefined subroutine called at ../a.pl line 10.

$ ( cd ./autodie-2.29; perl Makefile.PL >&3; make >&3; perl -Mblib ../a.pl && echo ok ) 3>/dev/null
Undefined subroutine called at ../a.pl line 10.

$ ( cd ./autodie-2.30; perl Makefile.PL >&3; make >&3; perl -Mblib ../a.pl && echo ok ) 3>/dev/null
ok

$ ( cd ./autodie-2.31; perl Makefile.PL >&3; make >&3; perl -Mblib ../a.pl && echo ok ) 3>/dev/null
ok

(CPAN 上找不到 2.30。)

为了防止出现此问题,请添加对 autodie 2.30 或更高版本的依赖项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在范围“no autodie”之后,程序在“*STDOUT”处终止 的相关文章

  • 缓存施瓦茨变换

    我正在学习 中级 Perl 它非常酷 我刚刚读完 施瓦茨变换 部分 在理解它之后 我开始想知道为什么变换不使用缓存 在具有多个重复值的列表中 转换会重新计算每个值的值 因此我想为什么不使用哈希来缓存结果 这是一些代码 a place to
  • 如何在 Perl 中运行匿名函数?

    sub print 1 sub print 1 我尝试了各种方法 都是错误的 sub 将为您提供指向该函数的指针 因此您必须通过引用调用 sub print Hello world n gt 另一种简单的方法 如所指出的布拉戈维斯特 布尤克
  • 将日期转换为指定格式并比较两个日期

    给定两个日期 Date1 format yyyy mm dd hh mm ss eg 2013 05 21 07 47 21 Date2 format Day Month date hh mm ss yyyy eg Thu Aug 1 09
  • Emacs cperl - 常量块中的缩进

    我正在运行基于 GNU Emacs 24 3 50 2 的 Aquamacs 3 0a cperl 版本是 6 2 当我编辑 Perl 常量块时 我得到了我不想要的额外缩进 use constant ONE gt 1 TWO gt 2 TH
  • 由于握手问题,PerL SSL 连接尝试失败

    我希望有人可以提供帮助 我正在使用 nagios 插件 check ilo2 health 该插件在我们的 OpenSuSE 系统上运行良好 但新的 Ubuntu 14 04 系统有问题 删除 nagios 的东西并运行 perl 基本上是
  • 使用 Perl 写入文件的最简单方法是什么?

    目前我正在使用 system echo panel login panel password root name root pass port panel type gt gt home shared ftp 使用 Perl 做同样的事情最
  • 为什么函数可以返回由 malloc 设置的数组,但不能返回由“int cat[3] = {0,0,0};”设置的数组

    为什么我可以从函数返回由 malloc 设置的数组 int dog int malloc n sizeof int 但不是数组设置 int cat 3 0 0 0 返回 cat 数组并带有警告 感谢你的帮助 这是一个范围问题 int cat
  • 我以为 Python 通过引用传递了所有内容?

    采取以下代码 module functions py def foo input new val input new val module main py input 5 functions foo input 10 print input
  • 真实设备中的 Android strace

    我有以下情况 我想监控Android手机上的系统调用 所以 我编写了一个脚本来做到这一点 使用 Android 模拟器可以完美地工作 将应用程序的痕迹写入我的 Ubuntu 上的特定文件中 问题是当我连接一个真实的手机来分析它时 它在结果文
  • Perl Moose TypeDecorator 错误。我该如何调试?

    我最近遇到了一个问题 非常感谢您的见解 我在圣诞节前在 PerlMonks 上发布了类似的问题 并提供了一些从 MooseX Declare 切换的反馈 http www perlmonks org node id 877703 1 我现在
  • 为什么函数可以修改调用者感知到的某些参数,但不能修改其他参数?

    我试图理解 Python 的变量作用域方法 在这个例子中 为什么是f 能够改变的值x 如内部所感知的main 但不是值n def f n x n 2 x append 4 print In f n x def main n 1 x 0 1
  • python - 使用“with”语句后的变量范围[重复]

    这个问题在这里已经有答案了 我在 stackoverflow 上没有找到这个问题的答案 所以我认为询问它可能会有所帮助 并将其放在这里 我在打开文件后声明一个新字典 方法如下 with open some file txt r as f d
  • linux + ksh + 向下舍入或向上舍入 - 浮点数

    在我的 ksh 脚本中 我只需要计算整数 有时我会得到浮点数 例如 3 49 或 4 8 等 所以我需要根据以下规则将浮点数转换为整数 示例 3 49 will be 3 2 9 will be 3 4 1 will be 4 23 51
  • Perl 中的布尔函数应该返回什么值?

    简短的问题 在 Perl 代码库中一致表示真假的最佳方法是什么 1 0 1 Perl 原生布尔运算符的特殊空字符串 return undef 即空列表 问题背景 我们都知道 Perl 在布尔值方面非常灵活 就像大多数事情一样 例如 Perl
  • matlab中类库的全局变量

    我有一些matlab声明的类 我如何声明所有类中都可见的常量 例如 这些常量可以是在所有类的方法中使用的物理常量 首先想到的是使用全局变量 还有更好的办法吗 最好在单独的文件中声明这些常量 包含常量的类是执行此操作的一种很好的干净方法 请参
  • 如何避免意外隐式引用全局对象的属性?

    是否可以在没有隐式的情况下执行代码块with global 所有脚本默认都有的上下文 例如 在浏览器中 是否有任何方法可以设置脚本 以便诸如 const foo location throws 未捕获的引用错误 位置未定义 而不是访问win
  • 使用perl,在每行都有相同单词的情况下如何选择最后两行?

    Bini 21 89753 20 47853 20 27835 18 34952 16 23454 Bini 16 89753 14 47853 13 27835 12 34952 11 23454 Bini 10 09014 我的文件有一
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • 块作用域链接 C 标准

    以下标识符没有链接 声明为对象或函数之外的任何标识符 声明为函数参数的标识符 未使用存储类说明符 extern 声明的对象的块作用域标识符 static int a no linkage 对于在该标识符的先前声明可见的范围内使用存储类说明符
  • unix df 上的正则表达式帮助

    我需要一些帮助来调整我的代码以查找此 UNIX 中的另一个属性df output Ex Filesystem Size Used Avail Capacity Mounted on dev ad4s1e 61G 46G 9 7G 83 ho

随机推荐