2011-11-21 48 views
6

Tôi đang viết một tập lệnh Perl có thể chạy cả từ dòng lệnh và từ trang web. Kịch bản lệnh nhận một vài tham số và nó đọc các tham số đó thông qua $ ARGV nếu nó bắt đầu từ dòng lệnh và từ CGI nếu nó bắt đầu từ một trang web. Làm thế nào tôi có thể làm điều đó?Sử dụng cả ARGV và CGI trong tập lệnh Perl

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

Biến tiêu chuẩn tuân thủ để kiểm tra chống lại được gọi là 'GATEWAY_INTERFACE': http://stackoverflow.com/questions/1914966/how-can-i-determine -if-a-script-được gọi là-từ-the-command-line-hoặc-as-a-cgi-scr http://stackoverflow.com/questions/3086655/in-perl-how-to-distiniguish- giữa-cli-cgi-mode http://stackoverflow.com/questions/4853948/how-can-i-tell-if-a-perl-script-is-executing-in-cgi-context – daxim

Trả lời

3

Cách sạch nhất có thể là đặt thịt mã của bạn vào một mô-đun và có một tập lệnh cho mỗi giao diện (CGI và dòng lệnh).

Bạn có thể kiểm tra sự hiện diện của biến môi trường CGI ($ENV{SERVER_PROTOCOL}) để xem CGI có đang được sử dụng hay không, nhưng điều đó sẽ thất bại nếu tập lệnh được sử dụng làm tập lệnh dòng lệnh từ tập lệnh CGI khác.

Nếu tất cả những gì bạn muốn chuyển qua @ARGV là đầu vào biểu mẫu, hãy nhớ rằng CGI (mô-đun) sẽ kiểm tra @ARGV cho đầu vào nếu tập lệnh không được gọi là tập lệnh CGI. Xem phần có tiêu đề "DEBUGGING" trong số documentation.

+0

Tôi đoán bạn đúng, trên thực tế tôi sẽ tạo ra một mô-đun lõi và hai giao diện riêng biệt, cảm ơn tất cả các bạn :) – raz3r

3

Khi được gọi thông qua CGI, tập lệnh của bạn sẽ bổ sung environment variables được đặt. Bạn có thể sử dụng chúng trong điều kiện if của bạn.

Ví dụ, bạn có thể sử dụng HTTP_USER_AGENT

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

Nhưng nếu nhu cầu thực sự của bạn là để kiểm tra một kịch bản CGI đứng một mình, Hãy thử ActiveState Komodo, The debugger cho phép để Simulate CGI Environment

9

Với CGI.pm bạn có thể chuyển tham số trên dòng lệnh mà không cần thay đổi mã của bạn. Trích dẫn các tài liệu:

Nếu bạn đang chạy các script từ dòng lệnh hoặc trong debugger perl , bạn có thể vượt qua kịch bản một danh sách các từ khóa hoặc tham số = cặp giá trị trên dòng lệnh hoặc từ đầu vào tiêu chuẩn (bạn không cần phải lo lắng về việc lừa kịch bản của bạn vào đọc từ biến môi trường)

WRT ví dụ của bạn, đó là một vấn đề thực hiện:

perl script.cgi username=John 
6

Mojolicious framework sử dụng tính năng tự động kiểm tra môi trường được chứng minh bởi chiến dịch hoạt động trên các máy chủ khác nhau (không chỉ Apache).

Vì vậy, bạn có thể sử dụng đoạn mã sau:

if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) { 
    # Go with CGI.pm 
} else { 
    # Go with Getopt::Long or whatever 
} 
Các vấn đề liên quan