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

Trouble using Perl's select() to redirect prints to STDERR, method is overwritten in a library

我正在尝试 运行 来自 Perl 库的特定子例程,该子例程在执行时会打印大量 HTML 代码。在做了一些研究之后,我发现可以使用 select() 方法暂时将 print 输出更改为 STDERR,将其完全隐藏在前端,然后一旦图书馆完成了它的工作。

很简单,但这对我不起作用。出于某种原因,有人在关键库中创建了一个方法 select() ,它与上述内容无关,但却是一种与我们的数据库进行交互的方法。因此,每当我尝试使用 my $filehandler = select(STDERR); 时,我都会改为获取数据库方法,这会导致错误。而且我无法评论此方法或将其从该库中的导出方法中删除,而不会在其他脚本上造成太多麻烦 - 包括我正在尝试的库 运行.

我什至不能使用 HTML 块评论来摆脱这个,因为图书馆也会打印评论。 运行 正确的 select() 方法还有其他替代方法吗?或任何其他替代方案来暂时阻止 HTML 被打印?

编辑:作为参考,我的 Perl 版本是为 x86_64-linux-thread-multi

构建的 v5.10.1 (*)

正如在 中已经提到的,最明显的解决方案是使用 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 函数和使用它的所有代码并告诉同事您有多喜欢它们的好时机。另外,观看与主题相关的this talk from the Swiss Perl Workshop 2017