为什么Perl说()没有在FCGI模式下追加换行符?

为什么Perl说()没有在FCGI模式下追加换行符?,perl,apache,cgi,fastcgi,Perl,Apache,Cgi,Fastcgi,在FCGI模式下,Perl的say函数有一个奇怪的行为。不会追加换行符。为什么会发生这种情况 示例代码: #!/usr/bin/perl -wT use strict; use warnings; use utf8; use feature qw( say ); use FCGI (); use CGI qw( header ); my $cnt = 0; my $req = FCGI::Request(); while ( $req->Accept() >= 0 ) { $

在FCGI模式下,Perl的say函数有一个奇怪的行为。不会追加换行符。为什么会发生这种情况

示例代码:

#!/usr/bin/perl -wT
use strict;
use warnings;
use utf8;
use feature qw( say );
use FCGI ();
use CGI qw( header );
my $cnt = 0;
my $req = FCGI::Request();
while ( $req->Accept() >= 0 ) {
    $cnt++;
    print header( -type => 'text/plain', -charset => 'utf-8' );
    say "Hello, world #$cnt";
    print "\n";
    print "$$\n"
    print 'Test 1234';
}
预期结果(以及通过控制台的实际结果):

通过Apache/FCGI的实际结果:

Content-Type: text/plain; charset=utf-8

Hello, world. #3
6709
Test 1234
一些软件信息

Debian哮喘病x86_64 Apache/2.2.22-11 mod_fcgid/1:2.3.6-1.1 Perl/5.14.2-12 FCGI.pm/0.75-1+b1


不幸的是,say()函数的实现需要filehandle支持$\变量。基本上,说等于写:

{ local $\ = "\n"; print LIST }

使用FCGI,STDOUT将被绑定的文件句柄替换,该文件句柄不支持$\。这意味着say()无法按预期工作。这是FCGI中的bug还是say()中的bug似乎还存在争议。

至于解决方案,我认为最简单的方法就是说“那就不要这样做”。另一种方法是修复FCGI。在后面添加'unshift@',如果定义了$\',则添加$\。但它有可能会破坏很多代码,这取决于FCGI不尊重$\。一个简单的解决方法是重新实现
say
使用subs qw/say/;分述{print@",“\n”}@IlmariKaronen正确。抢手货
{ local $\ = "\n"; print LIST }