PerlをCGIに変換する方法について教えてください

このQ&Aのポイント
  • 地域とサイズに応じて小包の料金を計算するPerlプログラムをCGIに変換したいです
  • 地域名とサイズを入力し、料金を計算して表示するプログラムです
  • Perlのコードを一部修正してCGIとして動作させる方法を教えてください
回答を見る
  • ベストアンサー

perlをcgiに変換

my(%area) = ( "愛知" => 0, #県内は仮に第0地帯とする "関東" => 1, #第1地帯 "信越" => 1, "近畿" => 1, "東海" => 1, "北陸" => 1, "東北" => 2, #第2地帯 "中国" => 2, "四国" => 2, "九州" => 3, #第3地帯 "北海道" => 5, #第5地帯 "沖縄" => 6, ); #地帯番号から、サイズ・料金対応表への変換 my(%postage) = ( 0 => { 60=> 600, 80=> 800, 100=>1000, 120=>1200, 140=>1400, 160=>1600, 170=>1700 }, 1 => { 60=> 700, 80=> 900, 100=>1100, 120=>1300, 140=>1500, 160=>1700, 170=>1900 }, 2 => { 60=> 800, 80=>1000, 100=>1200, 120=>1400, 140=>1600, 160=>1800, 170=>2000 }, 3 => { 60=> 900, 80=>1100, 100=>1300, 120=>1500, 140=>1700, 160=>1900, 170=>2100 }, 5 => { 60=>1100, 80=>1300, 100=>1500, 120=>1700, 140=>1900, 160=>2100, 170=>2300 }, 6 => { 60=>1200, 80=>1400, 100=>1600, 120=>1800, 140=>2000, 160=>2200, 170=>2400 }, ); print"愛知県から小包の地方を入力してください。\n"; chomp($areaname=<>); my $areano = $area{$areaname}; #if (!defined($areano)) { #print "地域名「$areaname」は正しくありません\n"; #exit; #} print"小包のサイズを入力してください。\n"; chomp($size=<>); my $price = $postage{$areano}->{$size}; #if (!defined($price)) { #print "サイズ「$size」は正しくありません\n"; #exit; #} $price =~ s/(\d)(\d{3})$/$1,$2/; print "$areaname 地方は第 $areano 地帯です。\n$size サイズは $price 円になります\n"; このperlは動きますが、どのようにcgiを書き換えればいいのか分かりません。 my $price = $postage {$areano}->{$hash{'size'}}; とするとエラーになってしまいます。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。

  • CGI
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

URLでパラメータ指定すると漢字があることからエンコードしなければいけなくなるため、その手間を惜しむならフォームが必要になります。 まずフォームはGETメソッドで **************************************************************************************************** <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>TEST</title> </head> <body> <form method="GET" action="./hoge.cgi"> <p>送り先:愛知から<select size="1" name="TO"> <option value="愛知">愛知</option> <option value="関東">関東</option> <option value="信越">信越</option> <option value="近畿">近畿</option> <option value="東海">東海</option> <option value="北陸">北陸</option> <option value="東北">東北</option> <option value="中国">中国</option> <option value="四国">四国</option> <option value="九州">九州</option> <option value="北海">北海</option> <option value="沖縄">沖縄</option> </select></p> <p>荷物のサイズ<select size="1" name="SZ"> <option value="60">60</option> <option value="80">80</option> <option value="100">100</option> <option value="120">120</option> <option value="140">140</option> <option value="160">160</option> <option value="170">170</option> </select></p> <p><input type="submit" value="送信" name="B1"><input type="reset" value="リセット" name="B2"></p> </form> </body> </html> **************************************************************************************************** こんな感じでファイル名は「hoge.html」とします 一回で入らないのでつぎへ

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

続き CGIはファイル名を「hoge.cgi」として ---------------------------------------------------------------------------------------------ここから #!/usr/bin/perl my %IN; my @tmpPrmt = split(/&/,$ENV{'QUERY_STRING'}); foreach(@tmpPrmt){ my ($p1,$v1) = split(/=/,$_); $v1 =~ tr/+/ /; $v1 =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego; if(exists($IN{$p1})){ $IN{$p1} .= "\t".$v1; }else{ $IN{$p1}=$v1; } } my(%area) = ( "愛知" => 0, #県内は仮に第0地帯とする "関東" => 1, #第1地帯 "信越" => 1, "近畿" => 1, "東海" => 1, "北陸" => 1, "東北" => 2, #第2地帯 "中国" => 2, "四国" => 2, "九州" => 3, #第3地帯 "北海道" => 5, #第5地帯 "沖縄" => 6, ); #地帯番号から、サイズ・料金対応表への変換 my(%postage) = ( 0 => { 60=> 600, 80=> 800, 100=>1000, 120=>1200, 140=>1400, 160=>1600, 170=>1700 }, 1 => { 60=> 700, 80=> 900, 100=>1100, 120=>1300, 140=>1500, 160=>1700, 170=>1900 }, 2 => { 60=> 800, 80=>1000, 100=>1200, 120=>1400, 140=>1600, 160=>1800, 170=>2000 }, 3 => { 60=> 900, 80=>1100, 100=>1300, 120=>1500, 140=>1700, 160=>1900, 170=>2100 }, 5 => { 60=>1100, 80=>1300, 100=>1500, 120=>1700, 140=>1900, 160=>2100, 170=>2300 }, 6 => { 60=>1200, 80=>1400, 100=>1600, 120=>1800, 140=>2000, 160=>2200, 170=>2400 }, ); $areaname = $IN{TO}; my $areano = $area{$areaname}; $size = $IN{SZ}; my $price = $postage{$areano}->{$size}; $price =~ s/(\d)(\d{3})$/$1,$2/; print "Content-type: text/plain\n\n"; print "$areaname 地方は第 $areano 地帯です。\n$size サイズは $price 円になります\n";

関連するQ&A

  • perlのcgiが文字化けします。

    perlを使ったcgiを作ろうと思い、こんなプログラムを書いてみたのですが、htmlのタグに囲まれた部分の日本語が文字化けしてしましいます。ファイルの文字列は上手く表示できるのですが… どうすればいいでしょうか。 文字コード判別をしてみたところ、このプログラム自体はShift-JISで書かれているようです。 開いているファイルはutf-8のようです。 #!/usr/bin/perl #ヘッダの表示 print "Content-Type: text/html; charset=utf-8\n\n"; print "<html>\n"; print "<head><title>掲示板</title></head>\n";#これが文字化け print "<body>\n"; print "<input type=\"text\" name=\"mail\" size=\"20\" value=\"\"><br>\n"; print "メッセージ<br>\n";#これも文字化け my $File = 'party0339.html'; if (-e $File) { #####@ファイルを開く…上でファイルが存在してることを確認して開けない場合はエラーメッセージ open(FF,"<:utf8",$File) or die "ファイル:$File を開けない $! \n"; my @FILE = <FF>; close (FF); ####@読み込んだデータを$Dataに格納する foreach (@FILE) { $Data = $_; print "$Data<br>\n"; } } #フッタの表示 print "</body>\n"; print "</html>\n"; exit (); 対策や原因などを教えてくださるとありがたいです。よろしくお願いします。

  • perl cgi 文字コード変換について

    掲示板でログファイルへの書き出しの際に文字コードをshift-jisに変更したいのですが, #投稿された値を受け取る if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); } else { $alldata = $ENV{'QUERY_STRING'}; } foreach $data (split(/&/, $alldata)) { ($key, $value) = split(/=/, $data); $value =~ s/\+/ /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg; $value =~ s/\t//g; $in{"$key"} = $value; } #ヘッダの表示 print "<html>\n"; print "<head><title>掲示板</title></head>\n"; print "<body>\n"; #受け取ったデータをファイルに書き込む if ($in{'handle'} ne '' && $in{'message'} ne '') { if (open(FH, "bbs.txt")) { @file = <FH>; close(FH); use CGI; $cgi=new CGI; $name1=$cgi->param('handle'); $name2=$cgi->param('number'); use Encode; use Encode::Guess qw(euc-jp shiftjis 7bit-jis); encode("shiftjis",decode('Guess',$name1)); encode("shiftjis",decode('Guess',$name2)); unshift(@file, "$name1\t$name2\n"); ##この部分で if (open(FH, ">bbs.txt")) { print FH @file; close(FH); } else { print "<p>ファイルに書き込めません。</p>"; } } else { print "<p>ファイルを読み込めません。</p>"; } } #投稿フォームの表示 print "<form method=\"post\" action=\"bbs.cgi\">\n"; print "<p>\n"; print "ハンドルネーム<br>\n"; print "<input type=\"text\" name=\"handle\" size=\"20\" value=\"\"><br>\n"; print "メッセージ<br>\n"; print "<input type=\"text\" name=\"message\" size=\"20\" value=\"\">\n"; print "</p>\n"; print "<p><input type=\"submit\" value=\"送信する\"></p>\n"; print "</form>\n"; #記事の一覧表示 if (open(FH, "bbs.txt")) { while ($data = <FH>) { ($handle, $message) = split(/\t/, $data); print "<p>\n"; print "投稿者:$handle<br>\n"; print "メッセージ:$message\n"; print "</p>\n"; } } else { print "<p>ファイルを読み込めません。</p>"; } #フッタの表示 print "</body>\n"; print "</html>\n"; exit; このような感じでかいたのですが文字コードを変更し,unshift(@file, "$name1\t$name2\n");と記述すると何も書かれずに空白になってしまいます..なぜでしょうか?困っています.教えて下さい. ちなみにunshift(@file, "$in{'handle'}\t$in{'message'}\n"); と文字コードの変更を意識しなかった場合にはちゃんとファイルに書かれています. jcode.plなどは使わずにencodeで行いたいです.

    • ベストアンサー
    • Perl
  • Perlによるディレクトリ内の連続的な大量データ処理

    Perlのテキスト処理に関する質問です.やりたいことはあるディレクトリ内に10000個ほどの(1)のようなテキストデータがあります.ここで私は(2)のプログラムを作成しました.しかしながら,このプログラムだと10000個あるテキストデータの一つしか処理できません.この処理内容をディレクトリ全体に適用させる方法はありますでしょうか?File::Find::Ruleなどがネット上にあったので使おうと努力しましたができませんでした.どなたかよろしくお願いします. (1)  2020 01 01 00 109.18970 18.36816 -2.317 -2.459 292.712 0.013 91.276 30.618 292.712 0.013 -2.317 -2.459 998.793 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2020 01 01 00 109.54297 18.39178 -2.702 -2.652 292.653 0.013 90.044 30.676  292.653 0.013 -2.702 -2.652 993.902 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ・ ・ ・ ・ (2) use warnings; open INFILE, '<', '2020-01-01_00.txt' or die "file open error: $!"; while( <INFILE> ){ chomp if( /\n$/ ); $Year = substr($_,0,4); chomp if( /\n$/ ); $Month = substr($_,5,2); chomp if( /\n$/ ); $Day = substr($_,8,2); chomp if( /\n$/ ); $Time = substr($_,11,2); chomp if( /\n$/ ); $Lon = substr($_,16,9); chomp if( /\n$/ ); $Lat = substr($_,29,8); chomp if( /\n$/ ); $Temp = substr($_,57,7); chomp if( /\n$/ ); $Hum = substr($_,76,6); chomp if( /\n$/ ); $Ozone = substr($_,85,6); chomp if( /\n$/ ); $Rad = substr($_,140,5); $data = $Year. "-".$Month."-".$Day." ".$Time." ".$Lon." ".$Lat." ".$Ozone." ".$Rad." ".$Hum." ".$Temp."\n"; open($data, ">", "data.txt") or die("error :$!"); } # ファイルを閉じる close INFILE; exit;  

  • perl

    授業でperlをやっていて課題がでてるのですが、 よく分かりません。 200以上300未満の数字か否かを判断する物を作りたいです。 が、300以上だと反応はないのですが200未満でも反応があります。 どこが違うのか教えてください 2つあります。 (1) my $a= 118; if($a < 200 ){ print "" } elsif($a => 300 ){ print "" } else { print "OK.\n"; } (2) my $x =111; if ($x ge 200 && $x lt 300){ print "OK.\n"; }

  • PerlからPythonについて

    以下のPerlをPythonで書くとどうなるのでしょうか? pythonのヒアドキュメントと<DATA>, chompの動作の置き換えが知りたいです。 ヒアドキュメントは"""や'''で可能?と思いますが、ヒアドキュメントを1行づつ取り出す方法がわかりません。 use strict; # <-- Pythonの厳格化?の警告方法も知りたいです。 while(<DATA>){ chomp; print "$_\n"; } exit; __DATA__ abc de f ghi 参考になるサイトや本をご存じの方教えてください。

    • ベストアンサー
    • Perl
  • perl-cgiのリネームについて

    Perl-CGIで ABCという、ディレクトリの中のファイルの名前を、ランダムな名前に変換したいのですがうまくいきません。 これを動作させるたびになぜか、どんどんファイルが減っていってしまいます。 どなたか、教えていただけないでしょうか? 宜しくお願い致します。 #!/usr/local/bin/perl print "Content-Type: text/plain\n\n"; $| = 1; my ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); my ($nowtime) = sprintf("%02d_%02d_%02d_%02d_%02d_",$year+1900,$mon+1,$mday,$hour,$min,$sec); #ディレクトリのファイル個数を記録する $dir = "./ABC/"; # ← ディレクトリを変数にセットする opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; # ← 「.」 「..」 以外のファイルを取得 close DIR; srand; for (my $i = @files; --$i; ) { my $j = int rand ($i + 1); next if $i == $j; @files[$i, $j] = @files[$j, $i]; } $num = 0; use File::Copy; foreach(@files){ $getpath = "$dir"."$_"; if( copy($getpath, "$dir".$nowtime.$num++.'.dat') eq 1){ $num++; unlink($getpath);}else{print "Copy Error"; exit;} }

    • ベストアンサー
    • CGI
  • perlの構文がおかしいようです。

    構文は以下の通りです。IF文のところがおかしいようですが、どこに間違いがあるのか教えていただけないでしょうか。 sub ippack { my ($a, $b, $c, $d) = @_; return ($a << 24) | ($b << 16) | ($c << 8) | $d; } sub ipunpack() { my ($n) = @_; return (($n>>24)&0xFF,($n>>16)&0xFF,($n>>8)&0xFF,$n&0xFF); } open (IN,"<useIP.txt") while(my $input = <IN>) { if ($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){; my $n = &ippack($1,$2,$3,$4); my $m = &ippack($5,$6,$7,$8); $n = $n & $m; $m = ~$m & 0xFFFFFFFF; for(my $i = 0; $i <= $m; $i++) { print join(".", &ipunpack($n+$i))."\n "; } } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ print "$input\n"; } print "\n"; }

    • ベストアンサー
    • Perl
  • if プログラムソース

    このプログラムソースでやりたいことは、 東海と入力すると 地方だと 東海は900円になります。 と表示させたいのですが、 うまく表示されません。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。 以下、プログラムソースです。 print"愛知県から小包の地方を入力してください。\n"; chomp($t=<>); if ( $1=="関東,信越,近畿,東海,北陸") { print"$t地方だと \n"; } elsif ( $1=="東北,中国,四国" ) { print"$t地方だと \n"; } elsif ( $1=="九州") { print"$t地方だと \n"; } elsif ( $1=="北海道") { print"$t地方だと \n"; } elsif ( $1=="沖縄" ) { print"$t地方だと \n"; } if ( $1 == 60 ){ print"$1は700円になります。\n"; } elsif ( $1==80) { print"$1は900円になります。\n"; } elsif ( $1==100 ) { print"$1は1,100円になります。\n"; } elsif ( $1==120 ) { print"$1は1,300円になります。\n"; } elsif ( $1== 140 ) { print"$1は1,500円になります。\n"; } elsif ( $1== 160 ) { print"$1は1,700円になります。\n"; }else { print"$1は1,900円になります。\n"; }

    • ベストアンサー
    • Perl
  • Perlのプログラミングについて

    Perlのプログラミングでつまづきました。 # ファイルから指定文字列を含む行を収集する # 入力ファイルのオープンと読み込み print( "入力ファイル名?" ); $n = <STDIN>; chomp( $n ); open( FIN, "<$n" ) or die "入力ファイルオープンエラー: $!\n"; $n = @a = <FIN>; close( FIN ); print( "$n 行読み込みました\n" ); # 行の収集 print( "検索文字列?" ); $x = <STDIN>; chomp( $x ); $ptn = $x; #指定の文字列 $x = @b = grep( /$ptn/, @a ); print( "$x 行見つかりました\n" ); # 出力ファイルのオープンと書き出し print( "出力ファイル名?" ); $y = <STDIN>; chomp( $y ); open( FOUT, ">$y" ) or die "出力ファイルオープンエラー: $!\n"; print FOUT ( $ptn, "\n" ); print FOUT ( $x, "\n" ); print FOUT ( @b ); close( FOUT ); というプログラムで実行すると C:\My Perl\pl>perl プログラムの実行.pl 入力ファイル名?sample1.txt 168 行読み込みました 検索文字列?k 45 行見つかりました 出力ファイル名?out3-24.txt 続行するには何かキーを押してください . . . となり出力ファイルの中身が表示されません。 どこを間違えているのかご指摘いただけないでしょうか?

  • perlでCGIプログラムを書いて画像が出ない

    CGIプログラムで画像を指定すると、ぺけのマークこそ出ないものの、肝心な絵が出ません。画像は同じディレクトリに置いてあります。 #!/usr/local/bin/perl $data = "146"; @list = split(//,$data); print "Content-type:text/html\n\n"; print <<EOF; <html> <head> <title>アクセスカウンターの表示だけ</title> </head> <body> <font size="4">あなたは</font> <img scr="img/$list[0].gif"> <img scr="$list[1].gif"> <img scr="$list[2].gif"> <font size="4">番目のお客様です</font> </body> </html> EOF exit; といった感じです。 よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう