11

我在 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';
}

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

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 Apache/2.2.22-11 mod_fcgid/1:2.3.6-1.1 Perl/5.14.2-12 FCGI.pm/0.75-1+b1

4

1 回答 1

12

不幸的是 say() 函数的实现需要文件句柄来支持 $\ 变量。基本上说相当于写:

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

使用 FCGI,您的 STDOUT 会被不支持 $\ 的绑定文件句柄替换。这意味着 say() 不能按预期工作。这是否是 FCGI 或 say() 中的错误似乎值得商榷。

于 2012-09-10T10:00:03.083 回答