Mac OS XでのPerl & CGI Webアプリケーション開発におけるforeach文のエラー

このQ&Aのポイント
  • Mac OS Xのローカル環境で『Perl&CGI Webアプリケーション開発』という本で勉強しています。サンプルスクリプトにはforeach文が含まれており、しかし実行するとエラーメッセージが表示されます。解決策を教えてください。
  • 質問者はMac OS XでPerlの勉強をしていますが、サンプルスクリプトの中のforeach文がエラーを引き起こしています。実行するとコンパイルエラーが表示されます。おかしい部分を教えてください。
  • Mac OS X環境でPerlとCGIの勉強をしており、foreach文が正しく動作しません。エラーメッセージが表示されるため、どこが問題なのかわかりません。ご指摘いただけると助かります。
回答を見る
  • ベストアンサー

Mac OS Xのローカル環境で

『Perl&CGI Webアプリケーション開発』という本で勉強しています。 その本に掲載されているサンプルスクリプトで #!/usr/bin/perl -wT use strict; use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); my $first_name = param('f_name'); my $last_name = param('l_name'); my $fav_color = param('color'); my @fav_sprots = param('sports'); my $sport_count = @fav_sprots; my $sport_text; print header; print start_html('test'); print qq(Hello $first_name $last_name<p>); print qq(Your Favorite color is : $fav_color<br>); if($sport_count > 1){ $sport_text = "sports are"; } else{ $sport_text = "sport is"; } print qq(And your favorite $sport_text :<br>); foreach(@fav_sports){ print qq(- $_ <br>); } print end_html(); がどうしてもうまく動きません。 foreach文をはずすと表示されるのですが、上記のままだと『Execution of /Library/WebServer/CGI-Executables/form2.cgi aborted due to compilation errors.』とエラーメッセージが出ます。 何かおかしなところがあれば教えていただけないでしょうか? 環境は Mac OS X 10.1.3 perl ver 5.6 です。 初心者のため質問の仕方も下手なのですが、よろしくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • aton
  • ベストアンサー率47% (160/334)
回答No.1

コンパイルエラーなら, perl -c スクリプト名 とやれば文法エラーをチェックしてくれるはず。'-w' オプションを追加すると,より詳しいエラーチェックをしてくれます。こんな感じ。 perl -cw スクリプト名 開発の勉強をされているのでしたら,デバッグ方法の勉強もされたほうがいいと思いますよ。

mura_taka
質問者

お礼

ありがとうございます。 早速試してみたところ、エラー箇所を見つけることができました。 その部分を辞書を片手に読んでみます。 デバッグの方法も勉強しないといけませんね。 本当にありがとうございました。

関連するQ&A

  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • CGI によるファイルのアップロード

    こんにちは。Perl初心者です。 ファイルのアップロードのプログラムを作ったのですが(と言っても書籍の丸写しですが..)サーバー上でエラーになってしまいます。どこが間違っているか教えて下さい。 環境:@niftyのホームページ(CGIは許可されています。), PC: Windows XP ソース: #!/usr/local/bin/perl use CGI qw(:standard); $file1 = param('file1'); open OUT, "> $file1"; while(<$file1>){   print OUT $_; } close OUT; $file2 = param('file2'); open OUT, "> $file2"; while(<$file2>){   print OUT $_; } close OUT; print <<"EOL"; Content-type: text/html <html> <body> Files have been uploaded.<br> $file1<br> $file2<br> </body> </html> EOL exit;

    • 締切済み
    • CGI
  • cgi.pmを使ったcgiに変更したのですが・・

    http://okwave.jp/qa/q7449935.html すみません、間違えて解決を押してしまいました・・・解決していないです。 前回返信いただいた内容を参考に、cgi.pmを使ってみることにしたのですが、 上手くいきません。 ボタンが表示されなくなってしまいました。 perlのcgiは作り方が色々あって選択が大変です・・・・・ #!/usr/bin/perl # wT付けるとエラー # 2012/05/01 cgi.pm使用開始 require 'cgi-lib.pl';# cgi-lib.plを呼び出す require "jcode.pl";# jcode.plライブラリを組み込む ########################################################################### use strict; use CGI; my $q = new CGI; print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"てすと", -BGCOLOR=>'#ffffff'), $q->li, # 空白? $q->center($q->h1('CGI.PM')), # 文字を大きく書く $q->br, $q->br, $q->li('<FONT color="brack">テスト?</FONT><BR>'), $q->li('<form action = \"***.cgi\" method=\"post\">');# ***.cgiにpostで送信 $q->li('<BUTTON type="submit"> テストボタン </BUTTON>'), $q->li('</form>'), $q->br, $q->strong("強調文字"), $q->br, $q->end_html; $q->hr, # 線を引く print "以下のパラメータを受け取りました。<BR>"; my ( $name, $value ); foreach $name ($q->param ) { print "$name:\n"; foreach $value ( $q->param( $name ) ) { print " $value\n"; } } exit;

    • ベストアンサー
    • CGI
  • ファイルのアップロードができません。

    Perl CGIモジュールを使ってファイルのアップロードをしたいのですが、うまくいきません。 以下HTML部分 =================================================================== <form action="test.cgi" enctype="multipart/form-data" method=post> 1つめのファイルを選択<input type="file" name="upimg1" size=40><br> <input type=submit value=アップロード></form> ==================================================================== 受け取るCGI ==================================================================== #!/usr/bin/perl use CGI qw(:standard); $upimg1 = param('upimg1'); open UP,"> ./img_dir/sample.jpg"; while(<$upimg1>){ print UP $_; } close UP print <<"EOL"; Content-type: text/html <html> <body> Files have been uploaded.<br> $file1<br> $file2<br> </body> </html> EOL exit; ===================================================================== 実際アップフォルダ内にはsample.jpgがあるのですが、0バイトできちんとアップされていません。 本をみて自分なりにやってみたのですが・・・ どこがまちがっていますか?よろしくお願いします。

    • ベストアンサー
    • CGI
  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • ファイルをアップロードするCGI

    ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";

  • メールフォーム

    #!/usr/bin/perl use CGI; $cgi = new CGI(); $from = $cgi->param('from'); $namae = $cgi->param('namae'); $naiyou = $cgi->param('naiyou'); print "Content-type: text/html\n\n"; # 設定 $sendmail = '/usr/lib/sendmail'; $to = '*********@*****************'; #$from = ''; $subject ='************'; # メール送信 open(MAIL,"| $sendmail -t"); # ヘッダ情報出力 print MAIL "To: $to\n"; print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n"; # 本文出力 print MAIL " $namae\n\n"; print MAIL " $naiyou\n"; close(MAIL); #確認表示 print " $namae<br><br>"; print " $naiyou<br><br>"; print "メールを送信しました<br>"; exit HTMLで<textarea rows="6" cols="60" wrap="hard" required name="naiyou"> としたのですが Perlで確認表示の$naiyouの所が英語も日本語は改行されません。

    • ベストアンサー
    • Perl
  • requireの使い方のどこがおかしいのでしょう?

    言語はperlです。 789.cgiから456.plを呼び出したいのですが、シンタックスエラーが出てきます。 789.cgiのrequireに関する行をコメントにしたら実行されるのですが…。 requireを使わずに、サブルーチン自体を789.cgiの中に書き込むことには成功しているのですが、 イマイチrequireを使った呼び出しのコツがわかりません。 どなたかご教授下さい。 以下にスクリプトを示しておきます。 よろしくお願いします。 *****以下789.cgi***** #!/usr/local/bin/perl use CGI::Carp qw(fatalsToBrowser); require "456.pl"; $a=12; $b=15; $d="xxxxxxxx"; $d=&plus(); print "content-type:text/html\n\n"; print <<"HTML_HTML"; <html> <head> <title> ヒアドキュメント </title> <body> ***** <br> $d <br> ***** <br> $a <br> ***** <br> $b <br> ***** </body> </html> HTML_HTML ***********以下456.pl************ sub plus { my $a=10; my $b=10; $c=$a+$b; return $c; }

    • ベストアンサー
    • CGI
  • perl cgi文字化け解消方法と[1~][11~][21~][最新10件]のようなリンクを付ける方法。

    perlにてcgiを勉強しようと初掲示板を作ってみました。 しかし、日本語を入力すると文字化けしてしまいます。 また、入力フォームの下に[1~][11~][21~][最新10件]のようなリンクを付けたいです。 以上2点のやり方を教えて下さい。お願いします。 #!/usr/bin/perl -w use strict; use warnings; use Encode; use utf8; use CGI; print "location: ./bbs.html\n\n"; print "Content-type: text/html\n\n"; my $q = new CGI; my $name = $q->param('name'); my $body = $q->param('body'); $name =~ s/</&lt;/g; $name =~ s/>/&gt;/g; $body =~ s/</&lt;/g; $body =~ s/>/&gt;/g; $body =~ s/\n/<br \/>/g; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon += 1; $wday = sprintf("%s", qw(日 月 火 水 木 金 土)[$wday]); my $time = sprintf "$year/%02d/%02d($wday) %02d:%02d:%02d",$mon,$mday,$hour,$min,$sec; open LOG, ">> log.txt"; print LOG "$time<>$name<>$body\n"; open LOG, "< log.txt"; my @log = <LOG>; close LOG; open HTML, "> bbs.html"; print HTML << "END"; <html> <head> <style> body{background:#f0f0f0;} span.name{color:blue;} p.body{margin-left:32px;} </style> <script type="text/javascript"> <!-- function check(form){ function id(id){return(document.getElementById(id));} if(form.name.value == "" || form.body.value == ""){ id('err').innerHTML = "入力に誤りがあります<br />"; id('err').style.color = "red"; return false; }else{ return true; } } //--> </script> <title>簡易掲示板</title> </head> <body> <form action="bbs.cgi" method="post" onsubmit="return check(this)"> <fieldset> <legend>入力フォーム</legend> <span id="err"></span> <label>名前</label><br /> <input type="text" name="name" /><br /> <label>本文</label><br /> <textarea name="body"></textarea><br /> <input type="submit" value="書き込み" /> </fieldset> </form> <hr /> END close HTML; open HTML, ">> bbs.html"; my $num = 0; for(@log){ $num++; chomp($_); my @write = split /<>/, "$_"; print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p>\n<p class='body'>$write[2]</p>\n"; } print HTML << "END"; <hr /> <a href="dammy">TOP</a> </body> </html> END close HTML; exit; よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう