2012-09-10 11 views
11

Mam dziwne zachowanie z funkcją mówienia Perla w trybie FCGI. Newlines nie będą dołączane. Dlaczego to się dzieje?Dlaczego Perl powiedział() nie dołączać nowej linii w trybie FCGI?

Przykładowy kod:

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

Oczekiwany wynik (i rzeczywisty wynik za pośrednictwem konsoli):

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

Hello, world. #1 

6712 
Test 1234 

Rzeczywisty wynik przez Apache/fcgi:

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

Hello, world. #3 
6709 
Test 1234 

Niektóre informacje oprogramowanie ..

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

Odpowiedz

12

Niestety realizacja funkcji say() wymaga, aby uchwyt pliku obsługiwał zmienną $ \. Zasadniczo powiedzieć jest równoważne formie pisemnej:

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

Korzystanie fcgi Twój STDOUT zastępuje wiązanej uchwytu pliku, który nie obsługuje $ \. Oznacza to, że funkcja say() nie działa zgodnie z przeznaczeniem. To, czy jest to błąd w FCGI, czy w say(), wydaje się dyskusyjne.

+0

Jeśli chodzi o rozwiązanie, myślę, że najłatwiej jest powiedzieć "nie rób tego". Alternatywą jest naprawienie FCGI. Dodanie 'unshift @_, $ \ if zdefiniowanego $ \\' po [linia 264 z FCGI.PL] (https://metacpan.org/source/FLORA/FCGI-0.74/FCGI.PL#L265) może załatwić sprawę . Ale jest szansa, że ​​złamie wiele kodów w zależności od FCGI, nie respektując $ \. – pmakholm

+0

Masz na myśli 'push @_, $ \ if defined $ \;', prawda? –

+1

Prostym obejściem byłoby ponowne wdrożenie 'say':' use subs qw/say /; sub say {print @_, "\ n"}; ' – Zaid

Powiązane problemy