Jor*_*tas 0 html perl overriding stderr
我试图从Perl库运行一个特定的子程序,该库在执行时打印大量的HTML代码.在做了一些研究之后,我发现可以使用select()方法暂时将print输出更改为STDERR,将其完全隐藏在前端,然后在库完成其工作后将其恢复到STDOUT.
很简单,但这对我不起作用.出于某种原因,有人在select()关键库中创建了一个与上述无关的方法,但是是一种与我们的数据库交互的方法.因此,每当我尝试使用时my $filehandler = select(STDERR);,我都会使用数据库方法,这会导致错误.我无法评论此方法或将其从该库中的导出方法中删除,而不会在其他脚本(包括我正在尝试运行的库)上造成太多麻烦.
我甚至不能使用HTML块注释来摆脱这种情况,因为库也会打印注释.有没有其他选择来运行正确的select()方法?或者任何其他替代方案可以暂时阻止HTML打印?
编辑:作为参考,我的Perl版本是为x86_64-linux-thread-multi构建的v5.10.1(*)
正如工具评论中已经提到的,最明显的解决方案是使用CORE::select.该CORE::命名空间总是给你的内置插件.
sub select { 1; }
sub html {
print "<html></html>";
}
open my $string_fh, '>', \my $string or die $!;
my $stdout = CORE::select $string_fh;
html();
CORE::select $stdout;
print "hello world";
Run Code Online (Sandbox Code Playgroud)
作为替代方案,您可以使用Capture :: Tiny,它实际上只在引擎盖下做同样的事情,但看起来更好.
use Capture::Tiny 'capture';
my ($stdout, undef, undef) = capture { html() };
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这可能是重构该select函数和使用它的所有代码的好时机,并告诉同事你有多喜欢它们.另外,请观看2017年瑞士Perl研讨会的演讲,该研讨会与该主题相关.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |