2012-09-10 30 views
11

मेरे पास एफसीजीआई मोड में पर्ल के कहने के फ़ंक्शन के साथ एक अजीब व्यवहार है। न्यूलाइन संलग्न नहीं होंगे। ऐसा क्यों होता है?पर्ल ने क्यों कहा() एफसीजीआई मोड में नई लाइन को शामिल नहीं किया?

नमूना कोड:

#!/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 

अपाचे/FCGI के माध्यम से वास्तविक परिणाम:

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

Hello, world. #3 
6709 
Test 1234 

कुछ सॉफ्टवेयर की जानकारी ..

डेबियन खरखरा x86_64 अपाचे/2.2.22-11 mod_fcgid/1: 2.3.6-1.1 पर्ल/5.14.2-12 FCGI.pm/0.75-1+b1

उत्तर

12

दुर्भाग्य से कार्यान्वयन कहें() फ़ंक्शन के लिए $ \ variable का समर्थन करने के लिए फ़ाइल हैंडल की आवश्यकता होती है। मूल रूप से कहते हैं कि लेखन के बराबर है:

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

FCGI का उपयोग करना, अपने STDOUT में टाई होने filehandle है, जो $ \ समर्थन नहीं करता है के द्वारा बदल दिया गया है। इसका मतलब है कि() इरादे के रूप में काम नहीं करता है। चाहे यह एफसीजीआई में एक बग है या कहें() में बहस योग्य प्रतीत होता है।

+0

एक समाधान के लिए मुझे लगता है कि यह कहना सबसे आसान है कि "ऐसा मत करो"। विकल्प एफसीजीआई तय करना है। [Uncift @_, $ \ अगर परिभाषित $ \\ 'के बाद [FCGI.PL के लाइन 264] (https://metacpan.org/source/FLORA/FCGI-0.74/FCGI.PL#L265) चाल चल सकता है । लेकिन एक मौका है कि यह एफसीजीआई के आधार पर बहुत सी कोड तोड़ देगा \ $ का सम्मान नहीं। – pmakholm

+0

आपका मतलब है 'पुश @_, $ \ अगर परिभाषित $ \; ', है ना? –

+1

'सरल' को फिर से कार्यान्वित करने के लिए एक सरल कामकाज होगा: 'subs qw/say/का उपयोग करें; उप कहते हैं {प्रिंट @_, "\ n"}; ' – Zaid