问题 为什么Perl说()不在FCGI模式中添加换行符?


Perl在FCGI模式下的函数我有一个奇怪的行为。新线不会被追加。为什么会这样?

示例代码:

#!/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';
}

预期结果(以及通过控制台的实际结果):

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

Hello, world. #1

6712
Test 1234

通过Apache / FCGI的实际结果:

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

Hello, world. #3
6709
Test 1234

一些软件信息......

Debian Wheezy x86_64   阿帕奇/ 2.2.22-11   mod_fcgid / 1:2.3.6-1.1   的Perl / 5.14.2-12   FCGI.pm/0.75-1+b1


5101
2017-09-10 09:15


起源



答案:


不幸的是,say()函数的实现需要filehandle来支持$ \ variable。基本上说是相当于写作:

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

使用FCGI,您的STDOUT将被绑定的文件句柄取代,该文件句柄不支持$ \。这意味着say()不能按预期工作。无论这是FCGI中的错误还是说()中的错误似乎都值得商榷。


12
2017-09-10 10:00



至于解决方案,我认为最简单的就是说“不要那样做”。另一种方法是修复FCGI。添加`unshift @_,$ \如果定义了$ \`之后 FCGI.PL第264行 可能会做的伎俩。但是有可能它会破坏很多代码,这取决于FCGI不尊重$ \。 - pmakholm
你意思是 push @_, $\ if defined $\;, 对? - Ilmari Karonen
一个简单的解决方法是重新实施 say: use subs qw/say/; sub say { print @_, "\n" }; - Zaid
@IlmariKaronen正确。接得好。 - pmakholm


答案:


不幸的是,say()函数的实现需要filehandle来支持$ \ variable。基本上说是相当于写作:

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

使用FCGI,您的STDOUT将被绑定的文件句柄取代,该文件句柄不支持$ \。这意味着say()不能按预期工作。无论这是FCGI中的错误还是说()中的错误似乎都值得商榷。


12
2017-09-10 10:00



至于解决方案,我认为最简单的就是说“不要那样做”。另一种方法是修复FCGI。添加`unshift @_,$ \如果定义了$ \`之后 FCGI.PL第264行 可能会做的伎俩。但是有可能它会破坏很多代码,这取决于FCGI不尊重$ \。 - pmakholm
你意思是 push @_, $\ if defined $\;, 对? - Ilmari Karonen
一个简单的解决方法是重新实施 say: use subs qw/say/; sub say { print @_, "\n" }; - Zaid
@IlmariKaronen正确。接得好。 - pmakholm