27 April 2011

(Perl) WebのGET・POST引数とコマンドライン引数の受け取り方

CGIでパラメータの受け取り方メモ

コマンドラインPerlスクリプトでの引数(パラメータ)の受け取り方

CPANライブラリGetopt::Longを用いて、GetOptions関数で引数を解析して変数に代入することが出来る。

ブール値スイッチ
command.pl -switch

文字列1個を取る引数
command.pl -param1 str1
command.pl --param1 str1
command.pl -param1=str1
command.pl --param1=str1

数値1個を取る引数
command.pl -param2 int

GetOpt::Longに渡されない、その他の引数 → @ARGV配列に代入される
command.pl str3 str4 ...

というように引数を扱うスクリプトは次のようになる。

#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
use Getopt::Long;
 
my $param1;
my $param2;
my $switch;
 
# プログラム引数を取り込む
GetOptions('param1|p1=s' => \$param1,
        'param2|p2=i' => \$param2,
        'switch' => \$switch);
 
if(defined($param1)){ print("param1=".$param1."\n"); }
if(defined($param2)){ print("param2=".$param2."\n"); }
if(defined($switch)){ print("switch=".$switch."\n"); }
 
# 残りの引数すべて
if($#ARGV >= 0){
    print("rest parameters ...\n");
    for(my $i=0; $i<=$#ARGV; $i++){
        print("ARGV[".$i."]=".$ARGV[$i]."\n");
    }
}
 
print("program end.\n");

Webでの引数の受け取り方

CPANライブラリCGIを用いて、param関数とurl_param関数で引数を得ることが出来る。

URLパラメータ、formのGETメソッド
http://example.com/program.cgi?param1=str2&param2=str2

url_param関数またはparam関数で取り出せる(form内データの送信をURLパラメータとして送信してくる)

formのPOSTメソッド

formからのデータはparam関数で取り出せる
※ URLパラメータとして渡されたデータは、url_param関数で別に取り出せる

#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
use File::Basename;
use CGI;
 
my $q = new CGI;
my $str_this_script = basename($0);             # このスクリプト自身のファイル名
 
print($q->header(-type=>'text/html', -charset=>'utf-8'));
print($q->start_html(-title=>"parameter test",
                -dtd=>['-//W3C//DTD XHTML 1.0 Transitional//EN','http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'],
                -lang=>'ja-JP'));
 
print("<p>parameter test  (examine param2)</p>\n");
 
print("<form method=\"post\" action=\"".$str_this_script."?urlparam1=value1&amp;param2=value2\" name=\"form\"></p>\n".
                "<p>postparam1: <input name=\"postparam1\" type=\"text\" size=\"50\" value=\"post parameter\" /></p>\n".
                "<p>param2: <input name=\"param2\" type=\"text\" size=\"50\" value=\"post parameter 2\" /></p>\n".
                "<p><input type=\"submit\" value=\"Send data\" /></p>\n".
                "</form>\n");
 
print("<p><a href=\"".$str_this_script."?urlparam1=value1&amp;param2=value2\">send url param only</a></p>\n");
 
print("<hr>\n<p>receive parameter</p>\n");
 
# URLで受け渡されるパラメータ
if(defined($q->url_param('urlparam1'))){
    print("<p>urlparam1 (url_param) = ".$q->url_param('urlparam1')."</p>\n");
}
if(defined($q->url_param('param2'))){
    print("<p>param2 (url_param) = ".$q->url_param('param2')."</p>\n");
}
 
# POST送信で受け渡されるパラメータ(POSTされないときは、URLが透過する)
if(defined($q->param('postparam1'))){
    print("<p>postparam1 (param) = ".$q->param('postparam1')."</p>\n");
}
if(defined($q->param('param2'))){
    print("<p>param2 (param) = ".$q->param('param2')."</p>\n");
}


POSTの場合の実行結果

http://localhost/test-param.cgi?urlparam1=value1&param2=value2
 
receive parameter
urlparam1 (url_param) = value1
param2 (url_param) = value2
postparam1 (param) = post parameter
param2 (param) = post parameter 2

GETの場合の実行結果

http://localhost/test-param.cgi?postparam1=post+parameter&param2=post+parameter+2
 
receive parameter
param2 (url_param) = post parameter 2
postparam1 (param) = post parameter
param2 (param) = post parameter 2

WebでGET・POST引数を画面表示するCGI

use strict;
use warnings;
use CGI;
 
print "Content-Type: text/plain\n\n";
 
my $q = new CGI;
 
# GETでデータ送受信(URLパラメーター)の場合
foreach my $param ( $q->url_param() ) {
    print "GET (url param) : $param = " . $q->url_param($param) . "\n";
}
 
# POSTでデータ送受信の場合
foreach my $param ( $q->param() ) {
    print "POST : $param = " . $q->param($param) . "\n";
}
 
print "EXIT:OK\n";