eval

Perl:$SIG {__ DIE__},eval {}和堆栈跟踪

解决方法依靠文档所说的任何东西都不推荐使用是不安全的.在未来的版本中,行为可能会发生变化.依靠不推荐的行为会将您锁定到今天运行的Perl版本中.不幸的是,我没有看到符合你的标准的方法.“正确”的解决方案是修改内部方法来调用Carp::confess而不是死,并放置定制的$SIG{__DIE__}处理程序.由于您还在死亡,您可能不需要将呼叫陷入inner().在您的示例中,您尝试通过$@返回数据.你不能这样做使用代替.

如何捕获Perl中鲤鱼的输出?

.说实话,我没有对eval的最好的了解–也许这不是捕捉鲤鱼警告输出的最佳方法.我尝试使用$SIG{WARN},但也是空的.有没有办法捕捉鲤鱼的输出?这不是最大的事情,因为这只是我的测试脚本,但我仍然希望让我的测试脚本正常工作.提前致谢!

解释Perl“前导”的瑕疵

Perl手册描述了一个完全迂回的构造,可以在任何csh,sh或Perl下工作,如下所示:呃真的吗?解决方法这个想法是,如果它们在标准的Bourneshell,Cshell或Perl中进行评估,那么这三行可以做3种不同的事情.只有在不支持使用#指定解释器名称的系统上才需要这个黑客攻击!在脚本开始的行.如果您执行Perl脚本以这3行作为shell脚本开始,shell将启动Perl解释器,传递脚本的文件名和命令行参数.在Perl中,三行形成一个声明,以…

perl – 使用“isa”方法的最佳方式?

什么是“最好的”使用方式“isa()”可靠?解决方法Scalar::Util实现明确更好.它避免了eval{}的开销,它总是导致设置一个附加变量.Scalar::Util实现更容易阅读.如果eval也失败了,我相信发生的是你在树之前向后走到eval之前的状态–这是如何实现复位状态.这带来了额外的故障开销.基准根本不是一个对象对象传递isa检查对象出现故障现象检查测试代码:我使用这是为i486-linux-gnu-thread-multi建立的perl,v5.10.1(*),以及Scalar::Util,1

如何使用仅在运行时才知道的Perl软件包?

我有一个Perl程序,需要使用包(我也写).其中一些包仅在运行系统中选择.我不想在我的代码中为所有这些包放置一个“使用”行,当然,只有一个“使用”行,基于这个变量,如下所示:不幸的是,这当然不行.有什么想法如何做到这一点?提前致谢,奥伦解决方法“use”在这里不起作用,因为它只在eval的上下文中导入.正如@Manni所说,其实最好是使用require.引用人perlfunc:

Perl中的CHECK,UNITCHECK和INIT区块的用处是什么?

一个BEGIN块是否因为某些原因不足够?导入功能在使用模块时运行,该模块在编译时进行.由于某些原因,说不需要模块是不够好的;模块–>进口.所以我的解决方法是在导入中构建eval的字符串,并保存另一个变量.然后我在一个INIT块中运行eval.当您运行调试器时,第一个执行点在INIT块的开头,我可以使用调试器来遍历eval语句.

如何在使用之前检查我是否有Perl模块?

我有以下Perl代码,它依赖于Term::ReadKey来获取终端宽度;我的NetBSDbuild缺少这个模块,所以我想默认的终端的宽度为80时,当模块丢失。我不知道如何有条件地使用模块,提前知道它是否可用。我当前的实现只是退出与一条消息说,如果它不存在,它找不到Term::ReadKey。我在NetBSD上使用Perl5.8.7,在CygWin上使用5.8.8你能帮我更有效地实现我的脚本吗?因此,如果SomeModule不可用,脚本将在编译时立即死亡。最后,请注意,我使用eval{…

如何在Perl库中解决一个’die’调用,我不能修改?

是的,问题是我使用的库,而不,我不能修改它。FOLLOWUPQUESTION:使用一个“eval”沙发碰撞倾向的调用工作很好,但如何设置处理可捕获错误在该框架内?而不是在这个子程序中用eval{}来调用每个调用,我只是允许它死掉,并在调用我的子程序的级别上使用eval{}:但是,有一些错误条件,我可以,并捕获在function()。什么是最适当/优雅的方式来设计在子程序和调用例程中的错误捕获,以便我获得捕获和未捕获错误的正确行为?解决方法你可以把它包装在一个eval。

如何在不使用eval的情况下动态地包含Perl模块?

我需要动态地包含一个Perl模块,但是如果可能的话,由于工作编码标准,我们希望远离eval。所有google搜索都会导致eval方法,但是没有任何其他方式。有没有eval可以做到这一点?解决方法在运行时使用require加载模块。如果模块无法加载,通常会将其包装在块eval中。你想尽可能地以原子方式获取这个值,以避免竞争条件其他的东西设置为不同的值。如果您在运行时不知道该模块的名称,则必须手动在模块名称和文件名之间进行翻译: