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¶m2=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&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&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¶m2=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¶m2=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";