27 April 2011

(Perl) Webとコマンドラインでの引数(パラメータ)の受け取り方

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