2011-11-21 19 views
6

में एआरजीवी और सीजीआई दोनों का उपयोग करके मैं एक पर्ल स्क्रिप्ट लिख रहा हूं जो कमांड लाइन और वेब पेज से दोनों चला सकता है। स्क्रिप्ट को कुछ पैरामीटर प्राप्त होते हैं और यह $ ARGV के माध्यम से उन पैरामीटर को पढ़ता है यदि यह कमांड लाइन से शुरू होता है और CGI से यह वेब पेज से शुरू होता है। मैं उसे कैसे कर सकता हूँ?पर्ल स्क्रिप्ट

my $username; 
my $cgi = new CGI; 
#IF CGI 
$username = $cgi->param('username'); 
#IF COMMAND LINE 
$username = $ARGV[0]; 
+1

के खिलाफ कहा जाता है की जाँच करने के मानक अनुरूप चर 'GATEWAY_INTERFACE': http://stackoverflow.com/questions/1914966/how-can-i-determine -if-a-script-was-called-the-the-command-line-or-as-a-cgi-scr http://stackoverflow.com/questions/3086655/in-perl-how-to-distiniguish- बीच-क्ली-सीजीआई-मोड http://stackoverflow.com/questions/4853948/how-can-i-tell-if-a-perl-script-is-executing-in-cgi-context – daxim

उत्तर

3

आपके कोड के मांस को मॉड्यूल में रखना सबसे साफ तरीका हो सकता है, और प्रत्येक इंटरफ़ेस (सीजीआई और कमांड लाइन) के लिए एक स्क्रिप्ट है।

सीजीआई पर्यावरण चर ($ENV{SERVER_PROTOCOL}) की उपस्थिति के लिए आप परीक्षण कर सकते हैं यह देखने के लिए कि क्या CGI का उपयोग किया जा रहा है, लेकिन अगर किसी अन्य सीजीआई स्क्रिप्ट से स्क्रिप्ट को कमांड लाइन स्क्रिप्ट के रूप में उपयोग किया जाता है तो यह असफल हो जाएगा।

यदि आप @ARGV के माध्यम से गुजरना चाहते हैं तो फॉर्म इनपुट हैं, ध्यान रखें कि सीजीआई (मॉड्यूल) @ARGV इनपुट के लिए जांच करेगा यदि स्क्रिप्ट को CGI स्क्रिप्ट के रूप में नहीं कहा जाता है। documentation में "DEBUGGING" नामक अनुभाग देखें।

+0

मुझे लगता है कि आप हैं ठीक है, वास्तव में मैं एक कोर मॉड्यूल और दो अलग इंटरफेस बनाने जा रहा हूं, आप सभी को धन्यवाद :) – raz3r

3

सीजीआई के माध्यम से आमंत्रित होने पर आपकी स्क्रिप्ट अतिरिक्त environment variables सेट होगी। आप उन्हें अपनी स्थिति में उपयोग कर सकते हैं।

उदाहरण के लिए, आप इस्तेमाल कर सकते हैं HTTP_USER_AGENT

if ($ENV{HTTP_USER_AGENT}) 
{ 
    #cgi stuff 
} 
else 
{ 
    #command line 
} 

लेकिन अगर अपने वास्तविक आवश्यकता एक CGI स्क्रिप्ट अकेले खड़े हैं, की कोशिश करो ActiveState कोमोडो परीक्षण करने के लिए है, डिबगर Simulate CGI Environment

9
साथ

करने की सुविधा देता है CGI.pm आप अपने कोड को बदलने की जरूरत के बिना कमांड लाइन पर पैरा पास कर सकते हैं। डॉक्स का हवाला देते हुए:

आप कमांड लाइन से या पर्ल डीबगर में स्क्रिप्ट चला रहे हैं, आप स्क्रिप्ट कमांड लाइन पर या मानक इनपुट से कीवर्ड या पैरामीटर = value जोड़े की एक सूची पारित कर सकते हैं (आप वातावरण चर से पढ़ में अपनी स्क्रिप्ट को धोखा देना बारे में चिंता करने की जरूरत नहीं है )

wRT अपने उदाहरण, यह कर की बात है:

perl script.cgi username=John 
6

Mojolicious framework युद्ध-सिद्ध पर्यावरण ऑटोडेक्सेक्शन का उपयोग करता है जो विभिन्न सर्वरों पर काम करता है (केवल अपाचे नहीं)।

तो तुम कोड निम्न का उपयोग कर सकते हैं:

if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) { 
    # Go with CGI.pm 
} else { 
    # Go with Getopt::Long or whatever 
} 
संबंधित मुद्दे