使用 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::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";
作为替代方案,您可以使用 Capture::Tiny,它实际上只是在底层做同样的事情,但看起来更好。
use Capture::Tiny 'capture';
my ($stdout, undef, undef) = capture { html() };
顺便说一句,现在可能是重构 select
函数和使用它的所有代码并告诉同事您有多喜欢它们的好时机。另外,观看与主题相关的this talk from the Swiss Perl Workshop 2017。
我正在尝试 运行 来自 Perl 库的特定子例程,该子例程在执行时会打印大量 HTML 代码。在做了一些研究之后,我发现可以使用 select()
方法暂时将 print
输出更改为 STDERR,将其完全隐藏在前端,然后一旦图书馆完成了它的工作。
很简单,但这对我不起作用。出于某种原因,有人在关键库中创建了一个方法 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";
作为替代方案,您可以使用 Capture::Tiny,它实际上只是在底层做同样的事情,但看起来更好。
use Capture::Tiny 'capture';
my ($stdout, undef, undef) = capture { html() };
顺便说一句,现在可能是重构 select
函数和使用它的所有代码并告诉同事您有多喜欢它们的好时机。另外,观看与主题相关的this talk from the Swiss Perl Workshop 2017。