2010-06-21 3 views
3

Je suis supposé écrire un script Perl qui peut être exécuté à la fois sur la ligne de commande et en tant que script CGI. Je n'ai pas pu déterminer comment je devrais distinguer les deux modes.Comment faire la distinction entre les modes CLI et CGI en Perl

Alors pourriez-vous s'il vous plaît laissez-moi savoir comment mettre en œuvre la logique?

Répondre

8

Vous pouvez vérifier la présence d'un nombre quelconque de CGI environment variables, par exemple:

if ($ENV{GATEWAY_INTERFACE}) 
{ 
     print "Content-type: text/plain\n\nLooks like I'm a CGI\n"; 
} 
else 
{ 
     print "I'm just a plain command line program\n"; 
} 
+0

Merci beaucoup ... – Bhavik

+0

Ceci est une mauvaise ressource, il ne répertorie pas le ['GATEWAY_INTERFACE'] obligatoire (http://www.faqs.org/rfcs/rfc3875.html#4.1.4.) . – daxim

+0

@daxim: merci; J'ai remplacé le lien par une meilleure ressource. – Ether

2

A une supposition, $ENV{'GATEWAY_INTERFACE'} sera NULL lorsqu'il est exécuté à partir de la ligne de commande, et contiennent quelque chose (par exemple 1.1) lorsqu'il est exécuté comme un CGI.

Vous devrez l'essayer.

+0

Euh, pourquoi ai-je été rejetée? Ma suggestion ne semble pas trop ridicule. Pourrait avoir au moins laissé un commentaire vous lâche ... – Pete

+0

Upvote pour vous, vous avez la meilleure réponse en termes de robustesse et d'exprimer l'intention au programmeur de maintenance. – daxim

+0

@daxim Merci, commençait à douter de mon savoir-faire Perl très rouillé. – Pete

0

Comme il est une question commune, je tiens à souligner qu'il ya plus de deux cas, les gens pourraient être intéressés à Pour une solution plus polyvalente.

use IO::Interactive qw(is_interactive); 

if (exists $ENV{'GATEWAY_INTERFACE'}) { 
    # running as CGI 
} 
elsif (is_interactive()) { 
    # running from terminal, with a real live user 
} 
else { 
    # running from cron, system call, etc 
} 

Si vous invitant l'utilisateur pour l'entrée, c'est le deuxième cas que vous voulez vérifier. Et avant de commencer à écrire votre propre implémentation de is_interactive() vous devriez probablement regarder this post par l'auteur du module IO::Interactive.

Questions connexes