Perl/CGI 入門

5,518 views

Published on

プログラムが初めての方向けのPerl/CGIの説明資料です。2010/11/20 に行われた Hokkaido.pm #3 で発表したものです。

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,518
On SlideShare
0
From Embeds
0
Number of Embeds
1,576
Actions
Shares
0
Downloads
13
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Perl/CGI 入門

  1. 1. Hokkaido.pm #3  超初心者向け Perl/CGI ~ Slideshare 用の補足  Hokkaido.pm #3 で発表したスライドです。  表紙は29ページ目にあり、本編はそこから始まります。  前半は、Macbook Pro 購入記念につきipad のCM音楽を流し ながら、Apple 風に perl を紹介するというネタ部分です。  興味のない方は、29ページ目からご覧ください。
  2. 2. Hokkaido.pm #3 Perl は
  3. 3. Hokkaido.pm #3 ↓ perl -ip -MEncode -e ‘$_ = encode(“utf-8”, decode(“cp932”, $_)); file' ↓ グループ名の由来 グループ名のAKBの由来は、ホームグラウンドが位置する秋葉 原(あきはばら)の略称「アキバ」(AKiBa)からである。プロ ジェクト開始当初は、「秋葉原48」として募集告知などをして おり[7]、NTT DoCoMoとのメンバー募集タイアップCMなどを始 め、インディーズデビュー当時の各種メディアでは 「Akihabara48」とされていたこともある。その後、「エーケー ビー」に統一された
  4. 4. Hokkaido.pm #3 効率的
  5. 5. Hokkaido.pm #3 べ、べつにAKBの ファンじゃないんだからねっ!
  6. 6. Hokkaido.pm #3 use MooseX::Declare; class BankAccount { has 'balance' => ( isa => 'Num', is => 'rw', default => 0 ); method deposit (Num $amount) { $self->balance( $self->balance + $amount ); } method withdraw (Num $amount) { my $current_balance = $self->balance(); ( $current_balance >= $amount ) || confess "Account overdrawn"; $self->balance( $current_balance - $amount ); } }
  7. 7. Hokkaido.pm #3 最先端
  8. 8. Hokkaido.pm #3 use Mojolicious::Lite; # /hello/* (everything) # /hello/test # /hello/test123 # /hello/test.123/test/123 get '/hello/(*you)' => sub { shift->render('groovy'); }; __DATA__ @@ groovy.html.ep Your name is <%= $you %>.
  9. 9. Hokkaido.pm #3 直感的
  10. 10. Hokkaido.pm #3
  11. 11. Hokkaido.pm #3 大規模
  12. 12. Hokkaido.pm #3 BioPerl
  13. 13. Hokkaido.pm #3 科学的
  14. 14. Hokkaido.pm #3 Image::Magick
  15. 15. Hokkaido.pm #3 芸術的
  16. 16. Hokkaido.pm #3 package Earth;sub Greet{ %_=('Y','~');$_='$;=!(Middle Earth.age~~~<Eart~~~~~~~~~~~~~h .age)?!(defined$ti~~~~~~~~~~~mez~~~On e[2])?!(push@time~~~~~~~~~~~~~~~~Zone,loc ~altime())?rotation?~~~~~~~~~~~~~q~~?The Worl ~~d?:q:[w]::q=[~~~~~~~~~~~~~~~~~d~a-f]=:q?..~~ ~~~?:q:.:;"42b3d3~~~~~~~~~~~~~~~~~~~~~728656c6c6f6 ~~~~~0277f627c64672~~~~~~~~~~~~~~~~~~~~~b3072796e647 ~~~~~~~42b3b3rg7d"=Ym~~~~~~~~~~~~~~~~~~~$;~~*;p~~~~u ~~~~~~~~~sh@_,$&;bless~~~~~~~~~~~~~~~~~~~~~~~~~$c~~~~~~~ ~~~~~~~~~o~ntine~~~~~nt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~s=~~~~~~~$~~~~~~~~~~~~~~~~~~~~~~~pangaea~~~~ ~~~~~~~~~~~~~~~;{l~~~~~~~~~~~~~~~~~~~~~~~~~~~~ocal@_;local$; ~~~~~~~~~~~~~~~~~="o~~~~~~~~~~~~~~~~~~~~~~~~~cean";$^A=(defi ~~~~~~~~~~~~~~~~~~~n~~~~~~~~~~~~~~~~~~~~~~~~~ed$continents)? ~~~~~~~~~~~~~~~~~~~(vec(~~~~~~~~~~~~~~~~~~~~~~$;, YYsplit(' ~~~~~~~~~~~~~~~~~',${$;}~~~~~~~~~~~~~~~~~~~~~~)%3,YYsplit( ~~~~~~~~~~~~~~~~q??,$;)**2-~~~~~~~~~~~~~~~~~~~~~~(($;=Ytr/oa ~~~~~~~~~~~~~~~~eiu//)**2))=~~~~~~~~~~~~~~~~~~~~~~=28160)?q: ~~~~~~~~~~~~~~~~~.::q?!?:'?~~~~~~~~~~~~~~~~~~~~~~';}$^A=Ys ~~~~~~~~~~~~~~~~:Q.E:pack(~~~~~~~~~~~~~~~~~~~~~~'h*',j ~~~~~~~~~~~~~~~~~oin(q(),~~~~~~~~~~~~~~~~~~~~~~~grep{$_= ~~~~~~~~~~~~~~~~~~Ym,$,,}~~~~~~~~~~~~~~~~~~~~~~~split(" ~~~~~~~~~~~~~~~~~",@_~~~~~~~~~~~~~~~~~~~~~~~~~~[0])) ~~~~~~~~~~~~~~~~):e~~~~~~~~~~~~~~~~~~~~~~~~~~~gexe ~~~~~~~~~~~~~~~;$d~~~~~~~~~~~~~~~~~~~~~~~~~~~="s ~~~~~~~~~~~~~~ort~~~~~~~~~~~~~~~~~~~~~~~~~~<= ~~~~~~~~~~~~>,~~~~~~~~~~~~~~~~~~~~~~~~~~YY ~~~~~~~~~~~@_~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~"~~~~~~~~~~~~~~~~~~~';; s,(~|r|n|s),,g;s.Y.x7e.g; eval};Greet;'the world';
  17. 17. Hokkaido.pm #3 呪文のよう
  18. 18. Hokkaido.pm #3 Acme::POE::Tree perl -MAcme::POE::Tree -e 'Acme::POE::Tree->new()->run()'
  19. 19. Hokkaido.pm #3 魔法のよう Xmas にひとりでもさみしくないぜ!!
  20. 20. Hokkaido.pm #3 ナ カ ーマ
  21. 21. Hokkaido.pm #3 友好的
  22. 22. Hokkaido.pm #3 まとめサイトから画像をぶっこ抜いてウマー お小遣い稼ぎサイトで自動クリックさせてウマー
  23. 23. Hokkaido.pm #3 美味しい
  24. 24. Hokkaido.pm #3 リビドー駆動開発
  25. 25. Hokkaido.pm #3
  26. 26. Hokkaido.pm #3
  27. 27. Hokkaido.pm #3 放送禁止的
  28. 28. プログラミング初めての方に送る Perl のインストールから簡単なCGIアプリの作成まで 谷内 元 (keroyonn) / Hokkaido.pm Hokkaido.pm #3
  29. 29.  WEB系プログラマ in Sapporo  仕事のメイン:Flex/ExtJS  趣味のメイン:C# +WPF  サーバーサイド: Perl  ちょっとずつ違う素敵なID達  cpan : keroyon http://search.cpan.org/~keroyon/  github : keroyonn http://github.com/keroyonn  twitter : keroyonn_ http://twitter.com/keroyonn_  hatena :keroyon0630 http://d.hatena.ne.jp/keroyon0630 Hokkaido.pm #3
  30. 30.  Perl と CGI についてやさしくゆるく語ります  プログラムを書いたことがない方でもOK  内容  Perl と CGI について  インストール  Perl の基本文法  CGIの基本  簡単なアプリを作ってみる Hokkaido.pm #3
  31. 31. Hokkaido.pm #3
  32. 32. Hokkaido.pm #3 Perl とは?
  33. 33. Hokkaido.pm #3 Ruby とか PHP とかの LL の始祖
  34. 34. Hokkaido.pm #3 LLって何さ? サイズがでかいのかよ!?
  35. 35. Hokkaido.pm #3
  36. 36. Hokkaido.pm #3 違います
  37. 37. Hokkaido.pm #3 本当は…
  38. 38. Hokkaido.pm #3
  39. 39. Hokkaido.pm #3 違います
  40. 40. Hokkaido.pm #3 でも何か6枚くらい あるらいしいよー
  41. 41.  軽量言語(Lightweight Language)  簡 単: Java や C++ に比べて学習曲線が緩やか つまり覚えやすいってことです  得意分野 :テキスト処理、ネットワーク処理など  苦手分野 :数値計算や画像処理など。 苦手分野もモジュール機構を使ってそれが得意な 人と連携することである程度克服できる Perl は発展を遂げ続けており、perlをまねた後発の言語の良いと ころをどんどん取り入れている。 結果として、どれも良く似ている。 人気の言語は多くは大規模サイトでの実績もあり、仕事で使わ れている Hokkaido.pm #3
  42. 42.  柔軟 (TMTOWTDI) There's more than one way to do it.  厳格(use strict) コンパイル時に未定義変数チェックとか コーディング規約のチェックとか  変なものに寛容 (Acme) Oppai / モーニング娘  CPAN (膨大なライブラリ群)  テスト文化 Hokkaido.pm #3
  43. 43. Hokkaido.pm #3
  44. 44. Hokkaido.pm #3 ブラウザ ・InternetExplorer ・Firefox WEBサーバー(接続要求を待受) ・Apache ・anHTTPD HTMLファイル 要求(リクエスト)解釈/実行 HTML/JS/CSSを送信(レスポンス) CGIファイル 要求 CGIプログラムを送信 解釈/実行 CGIファイル プログラミング言語 ・Perl、Ruby、Cなど 解釈/実行 HTMLを送信 解釈/実行 要求 データベースサーバー ・PostgreSQL ・MySQL ・Oracle など 抽出/保存 リッチクライアント デスクトップアプリ Flex/ExtJS/Silverlight/WPF XML/JSON/MessagePack とか 古典的 CGIアプリ 今時 WEBアプリ
  45. 45. Hokkaido.pm #3  WEBサーバー ホームページを公開しているプロバイダのコンピューターでは、WEBサー バーというプログラムが動作しています。 これはインターネットの利用者がHTMLファイルを見たいという要求を 送ってこないかどうかを常時監視しているプログラムです。  リクエスト/レスポンス 利用者がIEなどのブラウザでURLを入力すると、WEBサーバーへそのファ イルを見たいという要求をしたことになります。 要求を感知したWEBサーバーは、そのHTMLファイルをブラウザに送りつ けます。  ブラウザの解釈/レンダリング それがHTMLファイルであるうちは問題ありません。HTMLファイルに書か れるHTMLタグや、スタイルシート、JavaScriptはブラウザが解釈・実行で きるので、送られてきたファイルを実行すれば終わりです。 しかし、要求されたものがCGIファイルであった場合、ブラウザはそこに 書かれている特殊な命令が理解できません。
  46. 46. Hokkaido.pm #3  サーバーサイドによるHTML生成 WEBサーバーはCGIファイルが要求された場合、一度Perlというプログラム にCGIファイルを送りつけ、実行させます。 PerlはCGIファイルを実行し、HTMLファイルを自動生成します。そのHTML ファイルをWEBサーバーが送信するので、ブラウザでも解釈・実行ができ るようになります。  データベース連携 つまりCGIは利用者のパソコンで実行されるのではなく、サーバー上で動 作することになります。それによって、サーバー上にファイルを保存した り、サーバー上で動作しているデータベースサーバーからデータを抽出し てHTMLに変換するなどといったことが可能となります。  Perl とWEBサーバーが必要 自分が作成したHTMLファイルをチェックするには、ダブルクリックして 実行させればOKでしたが、CGIファイルはダブルクリックしてもブラウザ が解釈できません。そこでWEBサーバーとPerlをダウンロードし、インス トールする必要があります。
  47. 47. Hokkaido.pm #3 Perl とWEBサーバーのインストール
  48. 48. Hokkaido.pm #3  Active Perl  一番手軽。昔からのWindowsでの定番  モジュールの管理方法が Unix 環境とかなり違う  Strawberry Perl  手軽でUnix の perl に近い感覚で扱える  LarryWall 氏推奨  Cygwin  Linux にそっくり。でも微妙に違う。  導入もそんなに簡単じゃない  本物(VMWare で Ubuntuなど)  意外と導入が簡単 / OSはGUIでも操作できる  実際の本番環境にそっくりにできる  初心者向け参考書籍がたくさん出ている
  49. 49. Hokkaido.pm #3  Cで書かれた有名どころ  Apache(アパッチ)  nginx(エンジンエックス)  Lighttpd(ライティ)  Perl で書かれたPlack対応サーバー  Starlet (スターレット旧:Plack::Server::Standalone::Prefork::Server::Starter)  Starman (スターマン 旧: HTTP::Server::PSGI::Net::Server::PreFork)  Twiggy (トゥイッギー 旧:AnyEvent::Server)  Windowsオンリーな開発用  AN HTTPD
  50. 50. Hokkaido.pm #3  「わけわからん/とりあえず動かすだけで精一杯」の場合  AN HTTPD + Active Perl OR  AN HTTPD + Strawberry Perl (今日はこれ)  ちゃんと開発するなら  本番環境と同じ構成にします なので要件しだいです  たぶんVMWare などで Linux を動かすことになるでしょう  たぶん Apache(mod_perl/mod_fastcgi) か、Starlet/Starman になるで しょう  WAF を使った開発になるでしょう。WAF付属のサーバーも使うこと になります。  どんなに複雑な構成になったとしても、基礎/教養として古典的な CGI開発は知っておいて損はないでしょう
  51. 51. Hokkaido.pm #3  ダウンロードURL  http://strawberry-perl.googlecode.com/files/strawberry-perl- 5.12.1.0.m  インストール  GUIのインストーラがついている  ダブルクリックで実行すれば勝手に入れてくれる  インストールの確認  一度ログアウトしてログインしなおす  コマンドプロンプトを開く  perl –v と入力して Enter キーを押した時にバージョン番号 が表示されればOK
  52. 52. Hokkaido.pm #3  ダウンロードURL  http://www.st.rim.or.jp/~nakata/httpd142p.zip  インストール  インストーラはないので、任意のフォルダに解凍します  実行  解凍したフォルダ内の「httpd.exe」をダブルクリックしま す  タスクバーの時計の表示されているあたりに黄色いアイコ ンが表示されたら、無事実行されています
  53. 53. Hokkaido.pm #3  時計の横に常駐しているANHTTPDのアイコンを右ク リックして「オプション一般(G)」をクリックします  「一般」タブの「ドキュメントルート」を任意の内容に 変更します ※この設定値が、外部に公開されるファイルの置き場所 となります。つまり、Perl プログラムの保存先となりま す。  「表示/インデックス」タブのwww.browseableのチェッ クがついていたら、はずしておきます
  54. 54. Hokkaido.pm #3  メモ帳などのテキストエディタで以下の内容を入力後、 「hello.cgi」という名前で「ドキュメントルート」に設定したフォ ルダに保存します。 print "Content-type:text/htmlnn"; print "<html>"; print "<head>"; print "<title>Hello CGIWorld.</title>"; print "<style>"; print "h2 {background-color:aqua;}"; print "</style>"; print "<script>"; print "window.resizeTo(300,300);"; print "</script>"; print "</head>"; print "<body>"; print "<h2>Hello CGIWorld</h2>"; print "<p><b>CGI</b>テストプログラムです。</p>"; print "<p>スタイルシート・JavaScriptともに動いていますか?</p>"; print "<p>動いていない場合は;などの打ち忘れがないか確認しましょう</p>"; print "</body>"; print "</html>";
  55. 55. Hokkaido.pm #3  ブラウザから「http://localhost/ 」にアクセスします  hello.cgi というファイル名がブラウザにあらわれるので、 それをクリックします ※あらわれない場合は以下をチェックします  www.browseableのチェックがついていないこと  「ドキュメントルート」で設定したフォルダにファイルが保存 されていること  HTML文書が正しくレンダリングして表示されたら、動 作テストは完了です
  56. 56. Hokkaido.pm #3  入力間違いなどがあった場合に、ブラウザにエラーメッセー ジが表示されません。  WAFを使った場合には大抵きれいなエラーメッセージが表示されま す。  もしくはそのようにプログラムを書けば表示させることもできます。  WAFのような抽象化レイヤを使わないでWEBアプリを書いていいの は、基本的に勉強するためのコードの時だけ!!  WAF 使いたい人は、とりあえず Mojolicious::Lite でググるといい よ!!!!  リーダーが次回懇切丁寧に教えてくれるかもね!!!!!  っていうか今日懇親会で石垣さんに訊いてみるといいよ!!!!!!!!!!!!!  僕達は今日初めてプログラミングをする人達なので、コマン ドプロンプトを使ってエラーメッセージのチェックを行いま す。
  57. 57. Hokkaido.pm #3
  58. 58. Hokkaido.pm #3
  59. 59. Hokkaido.pm #3  次のソースを入力し、「ドキュメントルート」フォルダ に「debug.cgi」という名前で保存してください print "Content-type:text/htmlnn"; print "<html>"; print "<head><title>間違い探し</title></head>"; print "<body>"; # #をつけた行はコメント扱いになり、実行時には無視されます。 この行はどうなるでしょう? # 次の行には行末に「;」が抜けていますが、このまま入力してください。 print "<i>Hello</i>" print "<b>CGI World</b>"; print "</body>"; print "</html>";
  60. 60. Hokkaido.pm #3  「スタート」→「プログラム」→「アクセサリ」→「コマンドプロ ンプト」をクリックする  C:¥>と表示されたら、cd 半角スペース を入力後、「ドキュメン トルート」フォルダをウィンドウ内にドラッグします。  cd “ [あなたのフォルダ]”と表示されたら、Enterキーを押します  perl debug.cgiと入力してEnterキーを押します。 エラーが英文で表示されます。メッセージは英文ですが、「line 7」のように間違っている箇所の行数が表示されるので間違いを訂 正後、再度perl debug.cgiとします。 ※エラーが表示されなくなるまで繰り返します。  エラーが表示されなくなったら、ブラウザからhttp://localhost/を表 示させ、debug.cgiをクリックします。 正常に表示されることを確認してください。
  61. 61. Hokkaido.pm #3
  62. 62. Hokkaido.pm #3 Perl プログラムは単なるテキストファイル OS付属の「メモ帳」でプログラムを作ることができます。 Eclipse やVisual Studio といった「統合開発環境」は必要としません。 print で「標準出力」 標準出力でコマンドプロンプトだけでなく、CGIを使ったブラウザへの出力も可能です。 つまりWEBアプリケーションを作ることができます。 ファイルに出力することもできますが、今回は扱いません。 細かい書き方  コメント:プログラマの覚書のようなものです。どのような文字も書き込むことができます  命令文:組み込み関数。組み込み関数を組合せて自分で関数/命令を作成することもできます  引数:命令文に与えるデータです。  文字列:引数には数値と文字列を渡すことができます。文字列はダブルコーテーションで囲んでやる必 要があります。  エスケープシーケンス:文字列内には(バックスラッシュ)で始まる表示制御用の文字列を埋め込むこと ができます。nは改行を表わします。  セミコロン:命令文が終了することを表わす区切りの記号です。日本語の「。」と同じです # HelloWorld と画面に表示します print "Hello Worldn"; hello.pl
  63. 63. Hokkaido.pm #3  命令の一覧はどこで見れば?  「perl 関数 リファレンス」で検索すると見ることができます。 PHPとの違い Perl の組み込み関数は PHP ほど種類が多くありません。 多くの機能はモジュールとして提供されています。 たくさんのモジュールが標準で組込まれています。  中級者向け perldoc perlfunc で組み込み関数の一覧を見ることができます。 perldoc –f 組み込み関数名で命令の詳細を確認することができます。 ただし英語です。日本語もありますが、ちょっとセットアップが 難しいです。 試したい方は、「perldoc 日本語化」で検索すると出てきます。
  64. 64. Hokkaido.pm #3  perlのインストール場所の記述 1行目は「#!」に続けてperlがインストールされている絶対パスを記述します。 Strawberry Perlの場合は、#!/strawberry/perl/bin/perlとなります。 ホスティングサービスなどでUNIX系のサーバーを利用している場合には、 #!/usr/local/bin/perl または #!/usr/bin/perlなどとなることが多いようです。  #によるコメント 3行目と6行目の行頭に#がついています。こう書くとその行は Perl が無視します。 プログラマが自分のためのメモとして使ったりします。 1: #!/strawberry/perl/bin/perl 2: 3: # HTTPヘッダー出力 4: print "Content-type:text/htmlnn"; 5: この空行は出力されません 6: # HTML本文出力 7: print "<HTML>"; 8: print "<HEAD><TITLE>sample</TITLE></HEAD>"; 9: print "<BODY>Hello!!</BODY>"; 10:print "</HTML>";
  65. 65. Hokkaido.pm #3  Content-typeヘッダーの出力  昔風の素朴なCGIプログラムでは主にHTML文書を生成します。ところがそ のファイル名はcgiという拡張子です。  ブラウザは拡張子でファイルの種類を判断するため、そのままではHTML文 書として取り扱ってくれません。「HTTPヘッダー」を書くとコンテンツの 種類などをブラウザに伝えることができるようになります。  ブラウザは最初の空行までを、特殊な命令、空行以降をタグとして解釈しま す。その特殊な命令をHTTPヘッダーといいます。Content-type:text/htmlを最 初に出力することで、拡張子を無視し、HTMLファイル扱いさせることがで きます。その後は空行を出力するために、改行コードnを2回書かなければ いけません。 Content-type:text/html <html> 前は特殊命令 後はHTML 空行 2回の改行で空行ができる
  66. 66. Hokkaido.pm #3  記号には、それに続く一文字の特殊性を奪い、単なる文字として解釈させるという効果がありま す。 これをエスケープといいます。シングルコーテーションまたはダブルコーテーションの前にをつ けると、それを単なる文字として扱わせることで、正しいHTMLをつくることができます。  例 ■ "を文字として出力したい print """; ■ を文字として出力したい print "";  ポイント:ダブルコーテーションはでエスケープする。 記号自体を出力するためには¥¥とする必要がある。 <p align="center"> print "<p align="center">"; # これはエラー print "<p align="center">"; print '<p align="center">'; print "<p align='center'>";
  67. 67. Hokkaido.pm #3  Quoted like operators を使うとダブルコーテーションやシングルコー テーションの代わに任意の記号を文字列の区切り記号に使うことが できます。  qq任意の文字hogehoge任意の文字qq ダブルコーテーションと同じ  q任意の文字hogehoge任意の文字q シングルコーテーションと同じ print qq{<p align="center">}; print qq!<p align="center">!; print q{<p align="center">}; print q!<p align="center">!;
  68. 68. Hokkaido.pm #3  CGIでは非常に長いに及ぶHTML文書を書き出すこともありますが、 その際に毎回print文を書くのは非効率的です。ヒアドキュメントを 利用すると、ひとつのprint文で大量のHTMLを生成できます。  やや癖のある書き方となるので、特徴を覚えることが必要です。 #!/perl/bin/perl print <<”END”; Content-type:text/html <html> <head> <title>ヒアドキュメント・テスト</title> </head> <body bgcolor=”#0099cc”> <h3>サンプルです。</h3> </body> </html> END 空白推奨 < と ” 間の空白不可 改行必須 改行が反映される (nは不要) 改行は不可 改行必須 セミコロン不可 空白不可 任意の文字列でマーク(通常大文字)
  69. 69. Hokkaido.pm #3  __DATA__ と入力された行以降はプログラムでなく、データとして認識され るため、文字列を設定するのに利用できます。 ※Data::Section::Simple といったモジュールを利用すると楽に扱うことがで きます  YAMLやINI形式といった設定ファイルを利用して文字列を設定することも多 いです  実際には長い文字列は「テンプレートエンジン」と呼ばれる仕組みを使って 出力させます。 Text::MicroTemplate やText::Xslate が Perl でテンプレートエンジンの定番です。 ※今でもヒアドキュメントによる出力がなくなったわけではありません。 SQL文の埋め込みなどに利用するのに便利です。
  70. 70. Hokkaido.pm #3
  71. 71. Hokkaido.pm #3  perlでは通常の変数をスカラー変数と呼びます。  $マークを先頭につけることでそれが単なるアルファベットなのか、変数 なのかの判別を行います。  変数名には英数字とアンダースコアを利用することができますが、数字か ら始まる変数名は使えません。 #!/strawberry/perl/bin/perl $seisuu = 10; # 数値はただ=で代入します $shousuu = -0.8; # 負や小数も利用できます $moji1 = "Hello!"; # 文字は”が必要です。 $moji_2 = 'Good morning.'; # ‘も利用できます。 print $moji1;
  72. 72. Hokkaido.pm #3  スカラー変数は文字列内に混ぜることで文字と一緒に出力できます。 ※「展開される」と言います。  ‘ (シングルコーテーション)では変数は出力できません。ただの文字とみな されます。  (応用) UTF8フラグを立てたソースコードではprint “値は${seisuu}です”;など のように、{} で変数を覆う必要があります。 #!/strawberry/perl/bin/perl $seisuu = 1000; print $seisuu; # 変数名だけで出力できます print "$seisuun"; # “内でも展開されます print $seisuun; # nは文字なので”が必要です(エラー) print '$seisuun'; # ‘内では展開されません print ‘${seisuu}hogen’; # {} で前後の変数と結合されるのを防ぎます print "$seisuu='$seisuu'n"; # “内の’内では展開されます
  73. 73. Hokkaido.pm #3  + ー * / で、変数と定数どうしの四則演算ができます。  計算の優先順位を示すための かっこ() を利用することもできます。  これらの記号を演算子といいます  特に計算に使う演算子を算術演算子と呼びます。  「perl 演算子」でググるといいよ! #!/strawberry/perl/bin/perl $a = 100; $b = 3; $answer = $a * $b * 1.05; print "<p>お見積もり金額は<i>$answer</i>円(税込み)となりました。</p>"; 数値定数 #!/strawberry/perl/bin/perl $nedan = 800; $kazu = 39; $waribiki = 0.2; $kingaku = $nedan * $kazu * (1 - $waribiki); print “お見積もり金額は” . ”<b>$kingaku円</b>(税抜き)となりました。<br>"; 文字列の足し算(連結)もできたりします
  74. 74. Hokkaido.pm #3  変数名の後ろに[番号]を添えることで、複数の値をひとつの変数で管理で きます。  @を使うことで、一括代入、一括出力が可能です  通常の変数に[番号]をつけるだけなので、$a[0]というような形になります。 @a[0]ではないことに気をつけてください。  算術演算子を使った計算などもスカラー変数と同様に可能です #!/strawberry/perl/bin/perl $sinchou[0] = 173; # 個別に代入しています。 $sinchou[1] = 165; $sinchou[2] = 181; print "1番目の生徒の身長は$sinchou[0]cmです。n"; print "3番目の生徒の身長は$sinchou[2]cmです。n"; @taijuu = (68,50,92); # 一括で代入する場合には、@を使います。 print "2番目の生徒の身長は$sinchou[1]cm、体重は$taijuu[1]kgです。n"; print "3番目の生徒の体重は$taijuu[2]kgです。n"; print "一括表示:@sinchoun";
  75. 75. Hokkaido.pm #3 もの足りない人は、 List::Util、List::MoreUtils で ググって!!
  76. 76. Hokkaido.pm #3 一応補足。 $a と $b は特別な変数です あんまり気軽に使うと><
  77. 77. Hokkaido.pm #3 さらに補足。 こんな便利なものもあるよ! qw(apple orange banana)
  78. 78. Hokkaido.pm #3  $変数名[番号]に対して、$変数名{‘文字’}というように文字を添えて複数の データを管理できるのがハッシュです。  配列は番号による管理なので、同種のデータをまとめる場合には有効です が、様々な種類のデータを格納するのには向いていません。多様なデータ を扱う場合にはハッシュが向いています。  %を使うことで、一括代入が可能です  通常の変数に{‘文字’}をつけるだけなので、$a{‘文字’}というような形になり ます。 %a{‘文字’}ではないことに気をつけてください。  算術演算子を使った計算などもスカラー変数と同様に可能です
  79. 79. Hokkaido.pm #3 #!/strawberry/perl/bin/perl # 複数人の1種類のデータは配列(リスト) @kokugo = (98, 59, 67, 12, 33); print "<p>1番目の生徒の国語の得点は$kokuko[0]点です。</p>n"; print "<p>3番目の生徒の国語の得点は$kokugo[2]点です。</p>n"; # 一人の複数種類のデータは連想配列(ハッシュ) # 個別に代入しています $seito1{'sinchou'}=173; $seito1{'taijuu'}=67; $seito1{'IQ'}=0; print "<p>1番目の生徒の身長は$seito1{‘sinchou’}cmです。</p>n"; print "<p>1番目の生徒の体重は$seito1{‘taijuu’}kgです。</p>n"; print "<p>1番目の生徒の知能指数は$seito1{‘IQ’}です。</p>n"; # 一括代入するためには変数名に%をつけます %seito1 = ('kokugo'=>98, 'rika'=>65, 'suugaku'=>41, 'eigo'=>89); print "<p>1番目の生徒の理科の点数は$seito1{'rika'}点です。</p>n"; print "<p>1番目の生徒の英語の点数は$seito1{'eigo'}点です。</p>n";
  80. 80. Hokkaido.pm #3
  81. 81. Hokkaido.pm #3 ■条件式 -数値の場合- 等しい == 等しくない != 以上 >= より大きい > 以下 <= より小さい < -文字の場合- 等しい eq 等しくない ne ■条件の成立 1が返される ■条件の不成立 空文字列(0も同じ意味)が返される ■条件式の結合 同時に2つの条件を満たす 条件1 && 条件2 いずれかを一方を満たす 条件1 || 条件2 複雑な場合 条件1 && (条件2 || 条件3) 1を満たしていて、かつ 2または3のいずれかを満たす  処理の繰り返しと選択はプログラミングの基本的で重要な要素です。  perlでは「if」という選択構文と 「while」「for」 「foreach」という3種類 の繰り返し構文が用意されています。  このような構文のことを制御構文と呼びます。  これらに共通して重要なのが、「条件式」です。
  82. 82. Hokkaido.pm #3 #!/strawberry/perl/bin/perl %profile = ( 'name' => "鈴木", # 苗字 'tall' => 185, # 身長 'weight' => 80, # 体重 'blood' => "AB", # 血液型 'age' => 25 # 年齢 ); $hantei1 = $profile{'name'} == "佐藤"; # あえて==を利用しています。 $hantei2 = $profile{'tall'} >= 180; $hantei3 = $profile{'weight'} < 80; $hantei4 = $profile{'blood'} eq "AB"; $hantei5 = $profile{'age'} > 20 && $profile{'age'} <=30; $hantei6 = ($hantei1 || $hantei2) && $hantei3; print <<"END"; 結果 $hantei1 = '$hantei1' $hantei2 = '$hantei2' $hantei3 = '$hantei3' $hantei4 = '$hantei4' $hantei5 = '$hantei5' $hantei6 = '$hantei6' END
  83. 83. Hokkaido.pm #3  if 文を利用すると、条件を満している/いない場合に応じて複数の処理から ひとつを選択することができます。  else if は elsif と書きます if( 0または1 ){ 命令文1; 命令文2; … } if( 0または1 ){ 命令文; }else{ 命令文; } if( 0または1 ){ 命令文; }elsif( 0または1 ){ 命令文; }else{ 命令文; }
  84. 84. Hokkaido.pm #3 #!/strawberry/perl/bin/perl $hantei = 500 > 400; $count = 1000; # ifの基本は0または1です if(0){ print "出力されませんn"; } if(1){ print "出力されますn"; } # 条件式の判定結果を入れることで、実行する命令文を選択できます if($hantei){ print "条件式の結果が"$hantei"だったので出力されました。n"; }else{ print "条件式の結果が"$hantei"だったので出力されませんでした。n"; } # 条件式を直接いれることもできます if($count == 100){ print "あなたは記念すべき100人目の訪問者です。"; }elsif( A ){ print "100人突破記念!!101番目からの限定10名様はn"; print "下記パスワードで会員限定サイトにアクセスできます。n"; print "パスワード:$password"; }
  85. 85. Hokkaido.pm #3  whileを利用することで、同じを処理を何度も繰り返すことができます。  最も一般的な用途で使われる繰り返し命令であり、シンプルであるが故に 様々な目的に柔軟に対応できます。 while( 条件式 ){ 命令文1; 命令文2; … } #!/strawberry/perl/bin/perl # 10回繰り返されるようにしてください $i=0; while( A ){ print "$i回目の繰り返しですn"; $i++; # $i=$i+1と同義。自分自身を加算する }
  86. 86. Hokkaido.pm #3 ループ制御はこうです break → last continue → next ??? → continue 後置式のif とラベルのコンボ last ラベル名 if $a == 0;
  87. 87. Hokkaido.pm #3  forは指定回数を繰り返す処理に向いています。  for構文のカッコ内には3つの要素を入力します。  前述の while や 後述の foreach と比べるとちょっと難しいです。 #!/strawberry/perl/bin/perl # 10回繰り返されるようにしてください for($i=0; A ;$i++){ print "$i回目の繰り返しですn"; } for($i=10; B ;$i--){ print "$i=$in"; } for( 繰り返し前に実行する命令文; 条件式; 2回目以降の繰り返しで実行される命令文){ 命令文1; 命令文2; … }
  88. 88. Hokkaido.pm #3  foreachは配列要素を処理するための専用の繰り返し命令です。  配列要素の処理は非常に頻繁に行われるため、そのための専用命令が用意 されました。  指定された配列変数から、配列要素を順番に取り出し、スカラ変数に代入 します。  配列からすべての要素を取り出した時点で自動的に繰り返しが終了するの で条件式が必要ありません。 foreach スカラ変数 ( 配列変数 ){ 命令文1; 命令文2; … }
  89. 89. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100); # forで配列要素の繰り返し $max = scalar(@tokuten); # scalar(配列)は配列の要素数を求めます print "@tokutenの要素数は$maxです。n"; for($index=0; $index < $max; $index++){ print "$tokuten[$index] = $tokuten[$index]n"; } # whileで配列要素の繰り返し $i = 0; while($i<scalar(@tokuten)){ print "$tokuten[$i] の値は $tokuten[$i] ですn"; $i++; } # foreachで配列要素の繰り返しその1 foreach $youso ( @tokuten ){ print "$youson"; } # foreachで配列要素の繰り返しその2 $i = 0; foreach $t ( @tokuten ){ print "$tokuten[$i] = $tn"; $i++; }
  90. 90. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @namelist = ("阿部","伊藤","伊東","宇野","田辺","高橋","中村"); print <<"HEADER"; Content-Type: text/html <html> <head> <title>foreachによるtable</title> </head> <body> <table border="0" cellspacing="1" bgcolor="black"> HEADER foreach $name (@namelist){ print " <tr><td bgcolor=”white”>$name</td></tr>n"; } print <<"FOOTER"; </table> </body> </html> FOOTER
  91. 91. Hokkaido.pm #3  処理の選択と繰り返しはプログラミングの最重要事項です。  複雑な処理も、選択と繰り返しの組み合わせでできています。 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100,91,27,51,92,85,61,90,75,14,12,95,61,90,47,12,94,7,15,14,95,61, 97,59); # 計算の仕組み # $sum = 0; # $sum = $sum + 52; → $sum = 0 + 52; # $sum = $sum + 29; → $sum = 52 + 29; # …と繰り返すことで合計値が計算されます。 $sum = 0; foreach $t ( @tokuten ){ $sum = $sum + $t; } $avg = $sum / scalar(@tokuten); print "合計得点は$sumです。n"; print "平均得点は$avgです。n";
  92. 92. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100,91,27,51,92,85,61,90,75,14,12,95,61,90,47,12,94,7,15,14,9 5,61,97,59); # 50点以上だった場合のみ、$countが加算されるので、 # 50点以上を獲得した人数がカウントされます。 $count = 0; foreach $t ( @tokuten ){ if($t >= 50){ $count++; } } print "50点以上を獲得した受験者数は$count人です。n";
  93. 93. Hokkaido.pm #3 map とか grep とか @ret = grep {$_>=50} @tokuten @ret = map {$_ *=2} @tokuten
  94. 94. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100,91,27,51,92,85,61,90,75,14,12,95,61,90,47,12,94,7,15,14,9 5,61,97,59); # 50点の受験者がいたら、$exists_flagに1を代入 $exists_flag = 0; foreach $t ( @tokuten ){ if($t == 50){ $exists_flag = 1; } } if($exists_flag){ print "発見しました。n"; }
  95. 95. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100,91,27,51,92,85,61,90,75,14,12,95,61,90,47,12,94,7,15,14,9 5,61,97,59); # 最初に0を最大値($max)として仮定し、 # 繰り返しながら、逐次、個々の得点と$maxの大小関係を調べます。 # $maxよりも個々の得点の方が大きかった場合、 # $maxにはその得点が代入されます。 # 最終的には$maxに一番大きな値が代入されているはずです。 $max = 0; foreach $t ( @tokuten ){ if($max < $t){ $max = $t; } } print "最高得点は$maxです。n";
  96. 96. Hokkaido.pm #3 もの足りない人は、 List::Util、List::MoreUtils で ググって!!
  97. 97. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100,91,27,51,92,85,61,90,75,14,12,95,61,90,47,12,94,7,15,14,9 5,61,97,59); $i=0; foreach $t (@tokuten) { if($t >= 50){ $over50[$i] = $t; $i++; } } print "@over50";
  98. 98. Hokkaido.pm #3 #!/strawberry/perl/bin/perl @tokuten = (52,29,58,98,100,91,27,51,92,85,61,90,75,14,12,95,61,90,47,12,94,7,15,14,9 5,61,97,59); @tokuten = sort(@tokuten); # 昇順に並べ替え print "@tokutenn"; @tokuten = reverse(@tokuten); # 降順に並べ替え print "@tokutenn“;  sort でデータの整列(並び替え) ができます。  文字列として並べ替えが行われるため、数値の並び順がおかしくなります。 ※ 10o と 9 だと 9の方が大きいと判断される  sort { $a < => $b } 配列 とすると数値の昇順 sort{ $b <= > $a } 配列とすると数値の降順
  99. 99. Hokkaido.pm #3
  100. 100. Hokkaido.pm #3 第二部にご期待ください!
  101. 101. Hokkaido.pm #3
  102. 102. Hokkaido.pm #3  CGIプログラムではフォームまたはファイルからデータを受け取り(入 力)、それを加工した後でブラウザまたはファイルに出力します。また、 CGIプログラム自身にデータを埋め込むこともできます。 ブラウザ CGI ファイル ブラウザ ファイル 入力 出力加工
  103. 103. Hokkaido.pm #3 ■アクセスカウンタにおける処理 入力 アクセス回数が記録された1行のテキストファイルを読み取り、変数に代入 加工 その変数を1つ加算する。さらにHTML形式に整形する 出力 加算した結果をテキストファイルに上書きし、さらにブラウザにも出力 ■掲示板における処理 入力 フォームから投稿されたデータを変数に入力(最新の記事) 入力 ファイルに保存されている過去の記事を配列に入力(古い記事) 加工 フォームのデータとファイルのデータを結合し、配列に入力(全記事) 出力 全記事が揃った配列をカンマ区切り形式でファイルに上書き保存 出力 配列を1件ずつ繰り返しながらtable形式で整形表示 ■商品の注文フォームにおける処理 入力 注文フォームで入力された商品データを変数に入力 加工 金額などを計算し、見積もりを作成 出力 注文データをファイルに追加保存 出力 見積もりをHTMLで生成して出力 出力 注文があったことをメールで管理者に出力
  104. 104. Hokkaido.pm #3 form.html <html> <head><title>住所入力</title></head> <body> <form action="form.cgi"> 氏名:<input type="text" name="name"><br> 住所:<input type="text" name="address"><br> <input type="submit" value="送信"> </form> </body> </html>  formタグのaction属性 にこのフォームの入力処理を行うCGIプログラムの URLを設定します。  submit タグを押下すると、CGIプログラムにユーザーの入力データが渡り ます。
  105. 105. Hokkaido.pm #3 form.cgi #!/strawberry/perl/bin/perl use CGI; $q = CGI->new; $name = $q->param(‘name’); $address = $q->param(‘address’); print <<"END"; Content-type:text/html 氏名入力欄:$name 住所入力欄:$address END  use CGI とすると、CGI.pm というプログラム(モジュール)が読み込まれます  スカラ変数 = モジュール名->new とすると、モジュールが初期化されて使 えるようになります  スカラ変数->命令とすると、そのモジュールの命令が利用できます  CGI モジュールの場合には、param(フォーム名) で値が取得できます
  106. 106. Hokkaido.pm #3 #!/strawberry/perl/bin/perl # ここで右のフォームのHTMLを出力 # 入力の準備 use CGI; $q = CGI->new; #入力 $title = $q->param(‘title’); $url = $q->param(‘url’); $description = $q->param(‘description’); # 加工 $data = "$title,$url,$descriptionn"; # カンマ区切りの文字列に変換 # 出力 open $output, ‘>>’, ‘link.txt’; print $output $data; close $output;
  107. 107. Hokkaido.pm #3  フォームからの取得したデータは、データベースやテキストファイル(CSV 形式など)に保存することができます。  その際に様々な問題が起きるため、回避するの工夫が必要になります。  問題の例  何も入力していない状態でもデータが追加されてしまった  郵便番号を入力すべき箇所に日本語が入力されてしまった  半角の数値と全角の数値がまざってしまった  不正な命令を入力されてセキュリティが侵害されてしまった  複数行入力すると、データが壊れてしまった(CSV形式の場合)  漢字コードを変換しないと文字化けして表示されてしまった  同じデータを何回も追加できてしまった  などなど
  108. 108. Hokkaido.pm #3 きりがないのでひとつだけ
  109. 109. Hokkaido.pm #3  textareaを利用した複数行入力フィールドなどで、複数行の入力を行った 場合、改行マークも同時に保存されるため、テキストファイルのフォー マットが崩れます。  そこで改行マークを発見したら、<BR>タグに置き換えるという作業が必 要になります。  検索処理  if(変数名 =~ /検索文字列/){} 「検索文字列」を発見すると1が返り、ifの条件が満たされることにな ります。 変数の中に「検索文字列」を含んでいればよいので、変数と「検索文 字列」が完全に一致している必要はありません。  if(変数名 !~ /検索文字列/){} 「検索文字列」が変数に含まれなかった場合に条件が満たされます。
  110. 110. Hokkaido.pm #3  置換処理  スカラ変数 =~ s/検索文字列/置換文字列/g; 「検索文字列」を発見したら、それを「置換文字列」に置き換えます。 gは発見されたすべての文字列を置換するという意味になります。 gをつけなかった場合には最初に見つかった文字列を置換すると、終了 します。  例. 変数 =~ s/rn|r|n/<br>/g; rnはWindowsの、rはMacintoshの、nはUNIXの改行コードを表します。 「|」は「または」を表し、3つのコードのうちどれか一つを見つけた らという意味になります。
  111. 111. Hokkaido.pm #3 #!/strawberry/perl/bin/perl # ここで右のフォームのHTMLを出力 # 入力の準備 use CGI; $q = CGI->new; #入力 $title = $q->param(‘title’); $url = $q->param(‘url’); $description = $q->param(‘description’); # 加工 $description =~ s/rn|r|n/<br>/g; $data = "$title,$url,$descriptionn"; # カンマ区切りの文字列に変換 # 出力 open $output, ‘>>’, ‘link.txt’; print $output $data; close $output;
  112. 112. Hokkaido.pm #3 正規表現はまた今度!
  113. 113. Hokkaido.pm #3
  114. 114. Hokkaido.pm #3 今回できなかったこと リファレンス 関数 正規表現 CPAN/便利モジュール ネットワークプログラミング オブジェクト指向 モダンPerl ベストプラクティス セキュリティ Linux Apache Plack WAF AKB48 …
  115. 115. Hokkaido.pm #3 千里の道も一歩から 今後のHokkaido.pmの活動に ご期待ください
  116. 116. Hokkaido.pm #3

×