Upload
keroyonn
View
3.652
Download
1
Embed Size (px)
DESCRIPTION
プログラムが初めての方向けのPerl/CGIの説明資料です。2010/11/20 に行われた Hokkaido.pm #3 で発表したものです。
Citation preview
デモ
Hokkaido.pm #3
超初心者向け Perl/CGI ~Slideshare 用の補足 Hokkaido.pm #3 で発表したスライドです。 表紙は 29 ページ目にあり、本編はそこから始まります。 前半は、 Macbook Pro 購入記念につき ipad の CM 音楽
を流しながら、 Apple 風に perl を紹介するというネタ部分です。
興味のない方は、 29 ページ目からご覧ください。
デモ
Hokkaido.pm #3
Perl は
デモ
Hokkaido.pm #3
↓perl -ip -MEncode -e ‘$_ = encode(“utf-8”, decode(“cp932”, $_)); file'
↓
グループ名の由来グループ名の AKB の由来は、ホームグラウンドが位置する秋葉原(あきはばら)の略称「アキバ」( AKiBa )からである。プロジェクト開始当初は、「秋葉原 48 」として募集告知などをしており [7] 、 NTT DoCoMo とのメンバー募集タイアップ CMなどを始め、インディーズデビュー当時の各種メディアでは「 Akihabara48 」とされていたこともある。その後、「エーケービー」に統一された
デモ
Hokkaido.pm #3
効率的
デモ
Hokkaido.pm #3
べ、べつに AKB のファンじゃないんだからねっ !
デモ
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 ); } }
Moos
eautobo
xtraits
mixin
coroutine
イベント駆動非同期
サーバー
デモ
Hokkaido.pm #3
最先端
デモ
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.epYour name is <%= $you %>.
デモ
Hokkaido.pm #3
直感的
デモ
Hokkaido.pm #3
デモ
Hokkaido.pm #3
大規模
デモ
Hokkaido.pm #3
BioPerl
デモ
Hokkaido.pm #3
科学的
デモ
Hokkaido.pm #3
Image::Magick
デモ
Hokkaido.pm #3
芸術的
デモ
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';
デモ
Hokkaido.pm #3
呪文のよう
デモ
Hokkaido.pm #3
Acme::POE::Treeperl -MAcme::POE::Tree -e 'Acme::POE::Tree->new()->run()'
デモ
Hokkaido.pm #3
魔法のよう
Xmas にひとりでもさみしくないぜ !!
デモ
Hokkaido.pm #3
ナ カ ーマ
デモ
Hokkaido.pm #3
友好的
デモ
Hokkaido.pm #3
まとめサイトから画像をぶっこ抜いてウマー
お小遣い稼ぎサイトで自動クリックさせてウマー
デモ
Hokkaido.pm #3
美味しい
デモ
Hokkaido.pm #3
リビドー駆動開発
デモ
Hokkaido.pm #3
デモ
Hokkaido.pm #3
デモ
Hokkaido.pm #3
放送禁止的
Perl / CGI 入門プログラミング初めての方に送る Perl のインストールから簡単な CGI アプリの作成まで
谷内 元 (keroyonn) / Hokkaido.pm
Hokkaido.pm #3
自己紹介
WEB 系プログラマ in Sapporo 仕事のメイン: Flex/ExtJS 趣味のメイン: C# + WPF サーバーサイド : Perl
ちょっとずつ違う素敵な ID 達 cpan : keroyon http://search.cpan.org/~keroyon/ github : keroyonnhttp://github.com/keroyonn twitter : keroyonn_ http://twitter.com/keroyonn_ hatena :keroyon0630
http://d.hatena.ne.jp/keroyon0630
Hokkaido.pm #3
本日のお題
Perl と CGI についてやさしくゆるく語ります
プログラムを書いたことがない方でも OK
内容 Perl と CGI について インストール Perl の基本文法 CGI の基本 簡単なアプリを作ってみる
Hokkaido.pm #3
#1 Perl とは何か
Hokkaido.pm #3
デモ
Hokkaido.pm #3
Perl とは?
デモ
Hokkaido.pm #3
Ruby とか PHP とかの LL の始祖
デモ
Hokkaido.pm #3
LLって何さ?サイズがでかいのかよ ! ?
デモ
Hokkaido.pm #3
デモ
Hokkaido.pm #3
違います
デモ
Hokkaido.pm #3
本当は…
デモ
Hokkaido.pm #3
デモ
Hokkaido.pm #3
違います
デモ
Hokkaido.pm #3
でも何か 6 枚くらいあるらいしいよー
LL とは
軽量言語 (Lightweight Language)
簡 単: Java や C++ に比べて学習曲線が緩やかつまり覚えやすいってことです
得意分野 :テキスト処理、ネットワーク処理など
苦手分野 :数値計算や画像処理など。苦手分野もモジュール機構を使ってそれが得意な人と連携することである程度克服できる
Perl は発展を遂げ続けており、 perl をまねた後発の言語の良いところをどんどん取り入れている。結果として、どれも良く似ている。人気の言語は多くは大規模サイトでの実績もあり、仕事で使われている
Hokkaido.pm #3
Perl は他の LL と何が違うの? 柔軟 (TMTOWTDI)
There's more than one way to do it.
厳格 (use strict)コンパイル時に未定義変数チェックとかコーディング規約のチェックとか
変なものに寛容 (Acme)Oppai / モーニング娘
CPAN (膨大なライブラリ群 )
テスト文化Hokkaido.pm #3
#2 CGI とは何か
Hokkaido.pm #3
CGI の仕組み その 1
Hokkaido.pm #3
ブラウザ・InternetExplorer・ Firefox
WEB サーバー ( 接続要求を待受 )
・ Apache・ anHTTPDHTML ファイルHTML ファイル要求 ( リクエスト )
解釈/実行解釈/実行
HTML/JS/CSS を送信 ( レスポンス )
CGI ファイルCGI ファイル要求
CGI プログラムを送信
解釈/実行
CGI ファイルCGI ファイル
プログラミング言語・ Perl 、 Ruby 、 C な
ど
解釈/実行解釈/実行
HTML を送信解釈/実行解釈/実行 要求
データベースサーバー・ PostgreSQL・ MySQL・ Oracle など
抽出/保存抽出/保存
リッチクライアントデスクトップアプリ
Flex/ExtJS/Silverlight/WPF
XML/JSON/MessagePack とか
古典的CGI アプリ
今時WEB アプリ
CGI の仕組み その 2
Hokkaido.pm #3
WEB サーバーホームページを公開しているプロバイダのコンピューターでは、 WEB サーバーというプログラムが動作しています。これはインターネットの利用者が HTMLファイルを見たいという要求を送ってこないかどうかを常時監視しているプログラムです。
リクエスト /レスポンス利用者が IE などのブラウザで URL を入力すると、 WEB サーバーへそのファイルを見たいという要求をしたことになります。要求を感知した WEB サーバーは、その HTMLファイルをブラウザに送りつけます。
ブラウザの解釈 /レンダリング
それが HTMLファイルであるうちは問題ありません。 HTMLファイルに書かれる HTML タグや、スタイルシート、 JavaScript はブラウザが解釈・実行できるので、送られてきたファイルを実行すれば終わりです。しかし、要求されたものが CGIファイルであった場合、ブラウザはそこに書かれている特殊な命令が理解できません。
CGI の仕組み その 3
Hokkaido.pm #3
サーバーサイドによる HTML生成WEB サーバーは CGIファイルが要求された場合、一度 Perl というプログラムにCGIファイルを送りつけ、実行させます。Perl は CGIファイルを実行し、 HTMLファイルを自動生成します。その HTMLファイルを WEB サーバーが送信するので、ブラウザでも解釈・実行ができるようになります。
データベース連携
つまり CGI は利用者のパソコンで実行されるのではなく、サーバー上で動作することになります。それによって、サーバー上にファイルを保存したり、サーバー上で動作しているデータベースサーバーからデータを抽出して HTML に変換するなどといったことが可能となります。
Perl と WEB サーバーが必要自分が作成した HTMLファイルをチェックするには、ダブルクリックして実行させれば OK でしたが、 CGIファイルはダブルクリックしてもブラウザが解釈できません。そこで WEB サーバーと Perl をダウンロードし、インストールする必要があります。
#3 Perl / CGI の制作環境を整える
Hokkaido.pm #3
Perl と WEB サーバーのインストール
Perl の種類
Hokkaido.pm #3
Active Perl 一番手軽。昔からの Windows での定番 モジュールの管理方法が Unix 環境とかなり違う
Strawberry Perl 手軽で Unix の perl に近い感覚で扱える Larry Wall 氏推奨
Cygwin Linux にそっくり。でも微妙に違う。 導入もそんなに簡単じゃない
本物 (VMWare で Ubuntu など ) 意外と導入が簡単 / OS は GUI でも操作できる 実際の本番環境にそっくりにできる 初心者向け参考書籍がたくさん出ている
WEB サーバーの種類
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
開発用の推奨構成
Hokkaido.pm #3
「わけわからん / とりあえず動かすだけで精一杯」の場合 AN HTTPD + Active Perl
OR AN HTTPD + Strawberry Perl (今日はこれ )
ちゃんと開発するなら 本番環境と同じ構成にします
なので要件しだいです たぶん VMWare などで Linux を動かすことになるでしょう たぶん Apache(mod_perl/mod_fastcgi) か、 Starlet/Starman にな
るでしょう WAF を使った開発になるでしょう。 WAF付属のサーバーも使うことに
なります。 どんなに複雑な構成になったとしても、基礎 /教養として古典的な CGI 開
発は知っておいて損はないでしょう
Strawberry Perl のインストール
Hokkaido.pm #3
ダウンロード URL http://strawberry-perl.googlecode.com/files/strawbe
rry-perl-5.12.1.0.m
インストール GUI のインストーラがついている ダブルクリックで実行すれば勝手に入れてくれる
インストールの確認 一度ログアウトしてログインしなおす コマンドプロンプトを開く perl –v と入力して Enter キーを押した時にバージョン番号が表示されれば OK
AN HTTPD のインストール
Hokkaido.pm #3
ダウンロード URL http://www.st.rim.or.jp/~nakata/httpd142p.zip
インストール インストーラはないので、任意のフォルダに解凍します
実行 解凍したフォルダ内の「 httpd.exe 」をダブルクリッ
クします タスクバーの時計の表示されているあたりに黄色いアイ
コンが表示されたら、無事実行されています
AN HTTPD の設定
Hokkaido.pm #3
時計の横に常駐している ANHTTPD のアイコンを右クリックして「オプション一般( G )」をクリックします
「一般」タブの「ドキュメントルート」を任意の内容に変更します※この設定値が、外部に公開されるファイルの置き場所となります。つまり、 Perl プログラムの保存先となります。
「表示 / インデックス」タブの www.browseable のチェックがついていたら、はずしておきます
CGI の動作確認 その 1
Hokkaido.pm #3
メモ帳などのテキストエディタで以下の内容を入力後、「 hello.cgi 」という名前で「ドキュメントルート」に設定したフォルダに保存します。
print "Content-type:text/html\n\n";print "<html>";print "<head>";print "<title>Hello CGI World.</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 CGI World</h2>";print "<p><b>CGI</b> テストプログラムです。 </p>";print "<p> スタイルシート・ JavaScript ともに動いていますか? </p>";print "<p> 動いていない場合は;などの打ち忘れがないか確認しましょう </p>";print "</body>";print "</html>";
CGI の動作確認 その 2
Hokkaido.pm #3
ブラウザから「 http://localhost/ 」にアクセスします
hello.cgi というファイル名がブラウザにあらわれるので、それをクリックします※あらわれない場合は以下をチェックします www.browseable のチェックがついていないこと 「ドキュメントルート」で設定したフォルダにファイルが保存
されていること
HTML 文書が正しくレンダリングして表示されたら、動作テストは完了です
実行 / デバッグの方法 その 1
Hokkaido.pm #3
入力間違いなどがあった場合に、ブラウザにエラーメッセージが表示されません。 WAF を使った場合には大抵きれいなエラーメッセージが表示されます。 もしくはそのようにプログラムを書けば表示させることもできます。 WAF のような抽象化レイヤを使わないで WEB アプリを書いていいのは、
基本的に勉強するためのコードの時だけ !! WAF 使いたい人は、とりあえず Mojolicious::Lite でググるといい
よ !!!! リーダーが次回懇切丁寧に教えてくれるかもね !!!!! っていうか今日懇親会で石垣さんに訊いてみるといいよ !!!!!!!!!!!!!
僕達は今日初めてプログラミングをする人達なので、コマンドプロンプトを使ってエラーメッセージのチェックを行います。
(^_^) 「石垣さん」とは何か
Hokkaido.pm #3
デモ
Hokkaido.pm #3
実行 / デバッグの方法 その 2
Hokkaido.pm #3
次のソースを入力し、「ドキュメントルート」フォルダに「 debug.cgi 」という名前で保存してくださいprint "Content-type:text/html\n\n";print "<html>";print "<head><title>間違い探し </title></head>";print "<body>";# #をつけた行はコメント扱いになり、実行時には無視されます。この行はどうなるでしょう?# 次の行には行末に「 ; 」が抜けていますが、このまま入力してください。print "<i>Hello</i>"print "<b>CGI World</b>";print "</body>";print "</html>";
実行 / デバッグの方法 その 3
Hokkaido.pm #3
「スタート」→「プログラム」→「アクセサリ」→「コマンドプロンプト」をクリックする
C:¥>と表示されたら、 cd 半角スペース を入力後、「ドキュメントルート」フォルダをウィンドウ内にドラッグします。
cd “ [ あなたのフォルダ ]” と表示されたら、 Enter キーを押します
perl debug.cgi と入力して Enter キーを押します。エラーが英文で表示されます。メッセージは英文ですが、「 line 7 」のように間違っている箇所の行数が表示されるので間違いを訂正後、再度 perl debug.cgi とします。※エラーが表示されなくなるまで繰り返します。
エラーが表示されなくなったら、ブラウザから http://localhost/ を表示させ、
debug.cgi をクリックします。正常に表示されることを確認してください。
#4 Perl の基本文法 1 書き方
Hokkaido.pm #3
最初の Perl プログラム
Hokkaido.pm #3
Perl プログラムは単なるテキストファイルOS付属の「メモ帳」でプログラムを作ることができます。Eclipse や Visual Studio といった「統合開発環境」は必要としません。
print で「標準出力」標準出力でコマンドプロンプトだけでなく、CGIを使ったブラウザへの出力も可能です。つまり WEBアプリケーションを作ることができます。ファイルに出力することもできますが、今回は扱いません。
細かい書き方 コメント:プログラマの覚書のようなものです。どのような文字も書き込むことができます命令文:組み込み関数。組み込み関数を組合せて自分で関数/命令を作成することもできます引数:命令文に与えるデータです。 文字列:引数には数値と文字列を渡すことができます。文字列はダブルコーテーションで囲んでやる必要があります。 エスケープシーケンス:文字列内には\(バックスラッシュ)で始まる表示制御用の文字列を埋め込むことができます。\n
は改行を表わします。セミコロン:命令文が終了することを表わす区切りの記号です。日本語の「。」と同じです
# Hello World と画面に表示しますprint "Hello World\n";
hello.pl
組み込み関数
Hokkaido.pm #3
命令の一覧はどこで見れば? 「 perl 関数 リファレンス」で検索すると見ることができます。
PHP との違いPerl の組み込み関数は PHP ほど種類が多くありません。多くの機能はモジュールとして提供されています。たくさんのモジュールが標準で組込まれています。
中級者向けperldoc perlfunc で組み込み関数の一覧を見ることができます。perldoc –f 組み込み関数名で命令の詳細を確認することができます。ただし英語です。日本語もありますが、ちょっとセットアップが難しいです。
試したい方は、「 perldoc 日本語化」で検索すると出てきます。
Perl による CGI スクリプト例
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/perl2: 3: # HTTPヘッダー出力4: print "Content-type:text/html\n\n"; 5: この空行は出力されません 6: # HTML 本文出力7: print "<HTML>";8: print "<HEAD><TITLE>sample</TITLE></HEAD>";9: print "<BODY>Hello!!</BODY>";10:print "</HTML>";
Perl による CGI スクリプト例
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回の改行で空行ができる
引用符のエスケープ その 1
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'>";
引用符のエスケープ その 2
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">!;
ヒアドキュメント
Hokkaido.pm #3
CGI では非常に長いに及ぶ HTML 文書を書き出すこともありますが、その際に毎回 print 文を書くのは非効率的です。ヒアドキュメントを利用すると、ひとつの print 文で大量の HTML を生成できます。
やや癖のある書き方となるので、特徴を覚えることが必要です。
#!/perl/bin/perlprint <<”END”; Content-type:text/html
<html><head><title> ヒアドキュメント・テスト </title></head><body bgcolor=”#0099cc”><h3> サンプルです。 </h3></body></html>END
#!/perl/bin/perlprint <<”END”; Content-type:text/html
<html><head><title> ヒアドキュメント・テスト </title></head><body bgcolor=”#0099cc”><h3> サンプルです。 </h3></body></html>END
空白推奨 < と ” 間の空白不可
改行必須
改行が反映される(\n は不要 )
改行は不可
改行必須セミコロン不可
空白不可
任意の文字列でマーク(通常大文字)
その他の文字列の埋め込みと出力※初めての方は意味が分からなくても大丈夫です
Hokkaido.pm #3
__DATA__ と入力された行以降はプログラムでなく、データとして認識されるため、文字列を設定するのに利用できます。※Data::Section::Simple といったモジュールを利用すると楽に扱うことができます
YAML や INI形式といった設定ファイルを利用して文字列を設定することも多いです
実際には長い文字列は「テンプレートエンジン」と呼ばれる仕組みを使って出力させます。Text::MicroTemplate や Text::Xslate が Perl でテンプレートエンジンの定番です。※今でもヒアドキュメントによる出力がなくなったわけではありません。 SQL 文の埋め込みなどに利用するのに便利です。
#5 Perl の基本文法 2 変数
Hokkaido.pm #3
スカラー変数 代入
Hokkaido.pm #3
perl では通常の変数をスカラー変数と呼びます。
$ マークを先頭につけることでそれが単なるアルファベットなのか、変数なのかの判別を行います。
変数名には英数字とアンダースコアを利用することができますが、数字から始まる変数名は使えません。
#!/strawberry/perl/bin/perl$seisuu = 10; # 数値はただ=で代入します$shousuu = -0.8; # 負や小数も利用できます$moji1 = "Hello!"; # 文字は”が必要です。$moji_2 = 'Good morning.'; # ‘ も利用できます。print $moji1;
スカラー変数 出力
Hokkaido.pm #3
スカラー変数は文字列内に混ぜることで文字と一緒に出力できます。※「展開される」と言います。
‘ (シングルコーテーション ) では変数は出力できません。ただの文字とみなされます。
(応用 ) UTF8フラグを立てたソースコードでは print “ 値は ${seisuu}です” ; などのように、 {} で変数を覆う必要があります。
#!/strawberry/perl/bin/perl$seisuu = 1000;print $seisuu; # 変数名だけで出力できますprint "$seisuu\n"; # “ 内でも展開されますprint $seisuu\n; # \n は文字なので”が必要です ( エラー )print '$seisuu\n'; # ‘ 内では展開されませんprint ‘${seisuu}hoge\n’; # {} で前後の変数と結合されるのを防ぎますprint "\$seisuu='$seisuu'\n"; # “ 内の’内では展開されます
スカラー変数 計算
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>";
文字列の足し算 ( 連結 ) もできたりします
配列
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 " 一括表示 :@sinchou\n";
デモ
Hokkaido.pm #3
もの足りない人は、List::Util 、 List::MoreUtils で
ググって !!
デモ
Hokkaido.pm #3
一応補足。$a と $b は特別な変数です
あんまり気軽に使うと ><
デモ
Hokkaido.pm #3
さらに補足。こんな便利なものもあるよ !qw(apple orange banana)
連想配列
Hokkaido.pm #3
$ 変数名 [番号 ] に対して、 $ 変数名 {‘ 文字’ } というように文字を添えて複数のデータを管理できるのがハッシュです。
配列は番号による管理なので、同種のデータをまとめる場合には有効ですが、様々な種類のデータを格納するのには向いていません。多様なデータを扱う場合にはハッシュが向いています。
% を使うことで、一括代入が可能です
通常の変数に {‘ 文字’ } をつけるだけなので、 $a{‘ 文字’ } というような形になります。%a{‘ 文字’ } ではないことに気をつけてください。
算術演算子を使った計算などもスカラー変数と同様に可能です
連想配列
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";
#6 Perl の基本文法 3 処理の選択と繰り返し
Hokkaido.pm #3
処理の選択と繰り返し #1条件式
Hokkaido.pm #3
■ 条件式
-数値の場合-
等しい == 等しくない !=
以上 >= より大きい >
以下 <= より小さい <
-文字の場合-
等しい eq 等しくない ne
■ 条件の成立 1 が返される
■ 条件の不成立 空文字列 (0 も同じ意味 ) が返される
■ 条件式の結合
同時に 2つの条件を満たす
条件1 && 条件2
いずれかを一方を満たす
条件1 || 条件2
複雑な場合
条件 1 && ( 条件 2 || 条件 3) 1 を満たしていて、かつ 2または3のいずれかを満たす
処理の繰り返しと選択はプログラミングの基本的で重要な要素です。 perl では「 if 」という選択構文と 「 while 」「 for 」 「 foreach 」と
いう 3 種類の繰り返し構文が用意されています。 このような構文のことを制御構文と呼びます。 これらに共通して重要なのが、「条件式」です。
デモ
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
処理の選択と繰り返し #2if による処理の選択
Hokkaido.pm #3
if 文を利用すると、条件を満している / いない場合に応じて複数の処理からひとつを選択することができます。
else if は elsif と書きます
if( 0 または 1 ){
命令文1 ;
命令文2 ;
…
}
if( 0 または 1 ){
命令文 ;
}else{
命令文 ;
}
if( 0 または 1 ){
命令文 ;
}elsif( 0 または 1 ){
命令文 ;
}else{
命令文 ;
}
デモ
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";}
処理の選択と繰り返し #3while による繰り返し
Hokkaido.pm #3
while を利用することで、同じを処理を何度も繰り返すことができます。
最も一般的な用途で使われる繰り返し命令であり、シンプルであるが故に様々な目的に柔軟に対応できます。
while( 条件式 ){
命令文1 ;
命令文2 ;
…
}
#!/strawberry/perl/bin/perl# 10回繰り返されるようにしてください$i=0;while( A ){
print "$i回目の繰り返しです \n";$i++; # $i=$i+1 と同義。自分自身を加算
する}
デモ
Hokkaido.pm #3
ループ制御はこうですbreak → last
continue → next??? → continue
後置式の if とラベルのコンボlast ラベル名 if $a == 0;
処理の選択と繰り返し #4for による繰り返し
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=$i\n";}
for( 繰り返し前に実行する命令文 ; 条件式 ; 2回目以降の繰り返しで実行される命令文 ){
命令文1 ;
命令文2 ;
…
}
処理の選択と繰り返し #5foreach による繰り返し
Hokkaido.pm #3
foreach は配列要素を処理するための専用の繰り返し命令です。 配列要素の処理は非常に頻繁に行われるため、そのための専用命令が用意
されました。 指定された配列変数から、配列要素を順番に取り出し、スカラ変数に代入
します。 配列からすべての要素を取り出した時点で自動的に繰り返しが終了するの
で条件式が必要ありません。
foreach スカラ変数 ( 配列変数 ){命令文1 ;命令文2 ;
…}
デモ
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 で配列要素の繰り返しその1foreach $youso ( @tokuten ){
print "$youso\n";} # foreach で配列要素の繰り返しその2$i = 0;foreach $t ( @tokuten ){
print "\$tokuten[$i] = $t\n";$i++;
}
デモ
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
処理の選択と繰り返し #6簡単なデータ処理 合計 / 平均
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";
処理の選択と繰り返し #7簡単なデータ処理 カウント
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); # 50点以上だった場合のみ、 $count が加算されるので、# 50点以上を獲得した人数がカウントされます。$count = 0;foreach $t ( @tokuten ){
if($t >= 50){$count++;
}}print "50点以上を獲得した受験者数は $count 人です。 \n";
デモ
Hokkaido.pm #3
map とか grep とか@ret = grep {$_>=50} @tokuten@ret = map {$_ *=2} @tokuten
処理の選択と繰り返し #8簡単なデータ処理 検索
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); # 50点の受験者がいたら、 $exists_flag に1を代入$exists_flag = 0;foreach $t ( @tokuten ){
if($t == 50){$exists_flag = 1;
}} if($exists_flag){
print " 発見しました。 \n";}
処理の選択と繰り返し #9簡単なデータ処理 最大値 / 最小値
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); # 最初に0を最大値 ($max) として仮定し、# 繰り返しながら、逐次、個々の得点と $max の大小関係を調べます。# $max よりも個々の得点の方が大きかった場合、# $max にはその得点が代入されます。# 最終的には $max に一番大きな値が代入されているはずです。 $max = 0;foreach $t ( @tokuten ){
if($max < $t){$max = $t;
}}print "最高得点は $max です。 \n";
デモ
Hokkaido.pm #3
もの足りない人は、List::Util 、 List::MoreUtils で
ググって !!
処理の選択と繰り返し #10簡単なデータ処理 データ抽出
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); $i=0;foreach $t (@tokuten) {
if($t >= 50){$over50[$i] = $t;
$i++;}
} print "@over50";
処理の選択と繰り返し #10簡単なデータ処理 ソート
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); @tokuten = sort(@tokuten); # 昇順に並べ替えprint "@tokuten\n";@tokuten = reverse(@tokuten); # 降順に並べ替えprint "@tokuten\n“;
sort でデータの整列 (並び替え ) ができます。 文字列として並べ替えが行われるため、数値の並び順がおかしくなります。
※ 10o と 9 だと 9 の方が大きいと判断される sort { $a < => $b } 配列 とすると数値の昇順sort{ $b <= > $a } 配列とすると数値の降順
#7 ファイルの入出力
Hokkaido.pm #3
デモ
Hokkaido.pm #3
第二部にご期待ください !
#8 フォーム入力と典型的なデータ処理
Hokkaido.pm #3
CGI プログラムの流れ #1
Hokkaido.pm #3
CGI プログラムではフォームまたはファイルからデータを受け取り(入力)、それを加工した後でブラウザまたはファイルに出力します。また、CGI プログラム自身にデータを埋め込むこともできます。
ブラウザブラウザCGICGI
ファイルファイル
ブラウザブラウザ
ファイルファイル
入力 出力加工
CGI プログラムの流れ #2
Hokkaido.pm #3
■アクセスカウンタにおける処理入力 アクセス回数が記録された 1行のテキストファイルを読み取り、変数に代入 加工 その変数を 1 つ加算する。さらに HTML形式に整形する 出力 加算した結果をテキストファイルに上書きし、さらにブラウザにも出力
■掲示板における処理入力 フォームから投稿されたデータを変数に入力(最新の記事) 入力 ファイルに保存されている過去の記事を配列に入力(古い記事) 加工 フォームのデータとファイルのデータを結合し、配列に入力(全記事) 出力 全記事が揃った配列をカンマ区切り形式でファイルに上書き保存 出力 配列を 1件ずつ繰り返しながら table形式で整形表示
■商品の注文フォームにおける処理入力 注文フォームで入力された商品データを変数に入力 加工 金額などを計算し、見積もりを作成 出力 注文データをファイルに追加保存 出力 見積もりを HTML で生成して出力 出力 注文があったことをメールで管理者に出力
フォームデータの入力 #1
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 プログラムにユーザーの入力データが渡ります。
フォームデータの入力 #2
Hokkaido.pm #3
form.cgi#!/strawberry/perl/bin/perluse CGI;$q = CGI->new;$name = $q->param(‘name’);$address = $q->param(‘address’);
print <<"END";Content-type:text/html 氏名入力欄 :$name住所入力欄 :$addressEND
use CGI とすると、 CGI.pm というプログラム ( モジュール ) が読み込まれます
スカラ変数 = モジュール名 ->new とすると、モジュールが初期化されて使えるようになります
スカラ変数 ->命令とすると、そのモジュールの命令が利用できます CGI モジュールの場合には、 param(フォーム名 ) で値が取得できます
簡単な CGI アプリの例
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,$description\n"; # カンマ区切りの文字列に変換 # 出力open $output, ‘>>’, ‘link.txt’;print $output $data;close $output;
フォームデータの処理 #1
Hokkaido.pm #3
フォームからの取得したデータは、データベースやテキストファイル(CSV形式など ) に保存することができます。
その際に様々な問題が起きるため、回避するの工夫が必要になります。
問題の例 何も入力していない状態でもデータが追加されてしまった 郵便番号を入力すべき箇所に日本語が入力されてしまった 半角の数値と全角の数値がまざってしまった 不正な命令を入力されてセキュリティが侵害されてしまった 複数行入力すると、データが壊れてしまった (CSV形式の場合 ) 漢字コードを変換しないと文字化けして表示されてしまった 同じデータを何回も追加できてしまった などなど
デモ
Hokkaido.pm #3
きりがないのでひとつだけ
フォームデータの処理 #2改行コードの置換処理
Hokkaido.pm #3
textarea を利用した複数行入力フィールドなどで、複数行の入力を行った場合、改行マークも同時に保存されるため、テキストファイルのフォーマットが崩れます。
そこで改行マークを発見したら、< BR> タグに置き換えるという作業が必要になります。
検索処理 if( 変数名 =~ /検索文字列 /){}
「検索文字列」を発見すると 1 が返り、 if の条件が満たされることになります。変数の中に「検索文字列」を含んでいればよいので、変数と「検索文字列」が完全に一致している必要はありません。
if( 変数名 !~ /検索文字列 /){}「検索文字列」が変数に含まれなかった場合に条件が満たされます。
フォームデータの処理 #3改行コードの置換処理
Hokkaido.pm #3
置換処理 スカラ変数 =~ s/検索文字列 / 置換文字列 /g;
「検索文字列」を発見したら、それを「置換文字列」に置き換えます。g は発見されたすべての文字列を置換するという意味になります。g をつけなかった場合には最初に見つかった文字列を置換すると、終了します。
例. 変数 =~ s/\r\n|\r|\n/<br>/g;\r\n は Windows の、 \r は Macintosh の、 \n は UNIX の改行コードを表します。「|」は「または」を表し、3つのコードのうちどれか一つを見つけたらという意味になります。
フォームデータの処理 #3改行コードの置換処理
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/\r\n|\r|\n/<br>/g; $data = "$title,$url,$description\n"; # カンマ区切りの文字列に変換 # 出力open $output, ‘>>’, ‘link.txt’;print $output $data;close $output;
デモ
Hokkaido.pm #3
正規表現はまた今度 !
#8 まとめ
Hokkaido.pm #3
デモ
Hokkaido.pm #3
今回できなかったことリファレンス関数
正規表現CPAN/便利モジュール
ネットワークプログラミングオブジェクト指向
モダンPerlベストプラクティスセキュリティ
LinuxApachePlackWAF
AKB48…
デモ
Hokkaido.pm #3
千里の道も一歩から
今後の Hokkaido.pm の活動にご期待ください
ご清聴ありがとうございました
Hokkaido.pm #3