使用 Perl 的 select() 将打印重定向到 STDERR 时出现问题,方法在库中被覆盖



i正在尝试从perl库中运行特定的子例程,该库在执行时打印了大量的HTML代码。进行了一些研究之后,我发现可以使用select()方法将print输出暂时更改为STDERR,完全将其从前端隐藏,然后将其恢复到图书馆完成工作后将其恢复到Stdout。p>很简单,但这对我不起作用。由于某种原因,有人在关键库中创建了一种方法select(),该库与上述无关,但是与我们的数据库进行交互的方法。因此,每当我尝试使用my $filehandler = select(STDERR);时,我都会获得数据库方法,这会导致错误。而且我不能评论此方法或将其从该库中的导出方法中删除而不会在其他脚本上造成太多麻烦 - 包括我要运行的库。

我什至无法使用HTML块评论来摆脱困境,因为库还打印注释。还有其他替代方案可以运行正确的select()方法吗?或根本无法暂时防止HTML打印的其他选择?

编辑:作为参考,我的perl版本是v5.10.1(*),为x86_64-linux-thread-multi

构建

如Toolic在评论中已经提到的,最明显的解决方案是使用CORE::selectCORE::名称空间总是为您提供内置。

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";

作为替代方案,您可以使用Capture :: Tiny,这实际上只在引擎盖下做同样的事情,但看起来更好。

use Capture::Tiny 'capture';
my ($stdout, undef, undef) = capture { html() };

顺便说一句,这可能是重构select功能和所有使用它的代码的好时机,并告诉同事您有多喜欢它们。另外,请观看与该主题有关的瑞士Perl Workshop 2017的演讲。

最新更新