Why did Perl say() not append newline in FCGI mode?
I have a strange behaviour with Perl's say function in FCGI mode. Newlines won't be append. Why does this happen?
Sample code:
#!/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'; }
Expected result (and actual result via console):
Content-Type: text/plain; charset=utf-8 Hello, world. #1 6712 Test 1234
Actual result via Apache/FCGI:
Content-Type: text/plain; charset=utf-8 Hello, world. #3 6709 Test 1234
Some software info...
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
Answers
Unfortunately the implementation of the say() function requires the filehandle to support the $\ variable. Basically say is equivalent to writing:
{ local $\ = "\n"; print LIST }
Using FCGI, your STDOUT is replaced by a tied filehandle, which doesn't support $\. This means that say() doesn't work as intended. Whether this is a bug in FCGI or in say() seems to be debatable.