2011-11-21 12 views
6

Piszę skrypt Perla, który może działać zarówno z wiersza poleceń, jak i ze strony internetowej. Skrypt otrzymuje kilka parametrów i odczytuje te parametry przez $ ARGV, jeśli został uruchomiony z wiersza poleceń i od CGI, jeśli został uruchomiony ze strony internetowej. Jak mogę to zrobić?Używanie obu ARGV i CGI w skrypcie Perla

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

Zmienna zgodny ze standardami w celu sprawdzenia przed nazywa 'GATEWAY_INTERFACE': http://stackoverflow.com/questions/1914966/how-can-i-determine -if-a-script-was-called-from-the-command-line-or-as-a-cgi-scr http://stackoverflow.com/questions/3086655/in-perl-how-to-distiniguish- między-cli-cgi-mode http://stackoverflow.com/questions/4853948/how-can-i-tell-if-a-perl-script-is-executing-in-cgi-context – daxim

Odpowiedz

3

Najczystszym sposobem może być umieszczenie mięsa kodu w module i posiadanie skryptu dla każdego interfejsu (CGI i wiersz poleceń).

Można przetestować obecność zmiennych środowiskowych CGI ($ENV{SERVER_PROTOCOL}), aby sprawdzić, czy CGI jest używany, ale to się nie powiedzie, jeśli skrypt jest używany jako skrypt wiersza polecenia z innego skryptu CGI.

Jeśli wszystko, co chcesz przekazać za pośrednictwem @ARGV są wejściami formularza, należy pamiętać, że CGI (moduł) sprawdzi @ARGV dla danych wejściowych, jeśli skrypt nie jest wywoływany jako skrypt CGI. Zobacz rozdział zatytułowany "DEBUGGING" w documentation.

+0

Myślę, że jesteś prawda, w rzeczywistości mam zamiar stworzyć moduł podstawowy i dwa osobne interfejsy, dziękuję wam wszystkim :) – raz3r

3

Po wywołaniu przez CGI skrypt zostanie dodatkowo ustawiony na environment variables. Możesz ich użyć w swoim stanie jeśli.

Na przykład, można użyć HTTP_USER_AGENT

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

Ale jeśli prawdziwa potrzeba, aby przetestować skrypt CGI stand alone, spróbuj ActiveState Komodo, debugger pozwala na Simulate CGI Environment

9

Z CGI.pm można przekazywać parametry w wierszu poleceń bez konieczności zmiany kodu. Cytowanie docs:

Jeśli używasz skryptu z linii poleceń lub w Perl debuggera, można przekazać skrypt listę słów kluczowych lub parametru = par wartości w wierszu poleceń lub ze standardowego wejścia (ty nie trzeba się martwić o oszukiwanie skrypt do odczytu z zmiennych środowiskowych)

Wrt Twój przykład, jest to sprawa robi:

perl script.cgi username=John 
6

Mojolicious framework wykorzystuje sprawdzoną w warunkach bojowych autodetekcję środowiska, która działa na różnych serwerach (nie tylko w Apache).

Więc można użyć następującego kodu:

if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) { 
    # Go with CGI.pm 
} else { 
    # Go with Getopt::Long or whatever 
} 
Powiązane problemy