2012-09-10 7 views
11

Tengo un comportamiento extraño con la función de decir de Perl en el modo FCGI. Las nuevas líneas no se agregarán. ¿Por qué pasó esto?¿Por qué Perl dice() no añade nueva línea en modo FCGI?

Código de ejemplo:

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

Resultado esperado (y el resultado real a través de la consola):

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

Hello, world. #1 

6712 
Test 1234 

Resultado real a través de Apache/FCGI:

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

Hello, world. #3 
6709 
Test 1234 

Algo de información de software ..

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

Respuesta

12

Por desgracia, la aplicación de la función say() requiere que filehandle admita la variable $ \. Básicamente decir es equivalente a la escritura:

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

Usando FCGI, su STDOUT se sustituye por un gestor de archivo atado, que no soporta $ \. Esto significa que say() no funciona como se esperaba. Si esto es un error en FCGI o en decir() parece ser discutible.

+0

En cuanto a una solución, creo que es más fácil decir "No hagas eso entonces". La alternativa es arreglar FCGI. Agregar 'unshift @_, $ \ if defined $ \\' después de [línea 264 de FCGI.PL] (https://metacpan.org/source/FLORA/FCGI-0.74/FCGI.PL#L265) podría hacer el truco . Pero existe la posibilidad de que rompa una gran cantidad de código dependiendo de que FCGI no respete $ \. – pmakholm

+0

¿Quiere decir 'push @_, $ \ if defined $ \;', ¿verdad? –

+1

Una solución simple sería volver a implementar 'say':' use subs qw/say /; sub say {print @_, "\ n"}; ' – Zaid

Cuestiones relacionadas