perl/cgi 入門

116
デデ Hokkaido.pm #3 超超超超超超 Perl/CGI Slideshare 超超超超 Hokkaido.pm #3 超超超超超超超超超超超 超超超 29 超超超超超超超 超超超超超超超超超超超超超 、。 超超超Macbook Pro 超超超超超超超 ipad 超 CM 超超超超超超超超Apple 超超 perl 超超超超超超超超超超超超超超 超超超超超超超29 超超超超超超超超超超超超

Upload: keroyonn

Post on 11-Jun-2015

3.652 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Perl/CGI 入門

デモ

Hokkaido.pm #3

超初心者向け Perl/CGI ~Slideshare 用の補足 Hokkaido.pm #3 で発表したスライドです。 表紙は 29 ページ目にあり、本編はそこから始まります。 前半は、 Macbook Pro 購入記念につき ipad の CM 音楽

を流しながら、 Apple 風に perl を紹介するというネタ部分です。

興味のない方は、 29 ページ目からご覧ください。

Page 2: Perl/CGI 入門

デモ

Hokkaido.pm #3

Perl は

Page 3: Perl/CGI 入門

デモ

Hokkaido.pm #3

↓perl -ip -MEncode -e ‘$_ = encode(“utf-8”, decode(“cp932”, $_)); file'

グループ名の由来グループ名の AKB の由来は、ホームグラウンドが位置する秋葉原(あきはばら)の略称「アキバ」( AKiBa )からである。プロジェクト開始当初は、「秋葉原 48 」として募集告知などをしており [7] 、 NTT DoCoMo とのメンバー募集タイアップ CMなどを始め、インディーズデビュー当時の各種メディアでは「 Akihabara48 」とされていたこともある。その後、「エーケービー」に統一された

Page 4: Perl/CGI 入門

デモ

Hokkaido.pm #3

効率的

Page 5: Perl/CGI 入門

デモ

Hokkaido.pm #3

べ、べつに AKB のファンじゃないんだからねっ !

Page 6: Perl/CGI 入門

デモ

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

イベント駆動非同期

サーバー

Page 7: Perl/CGI 入門

デモ

Hokkaido.pm #3

最先端

Page 8: Perl/CGI 入門

デモ

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 %>.

Page 9: Perl/CGI 入門

デモ

Hokkaido.pm #3

直感的

Page 10: Perl/CGI 入門

デモ

Hokkaido.pm #3

Page 11: Perl/CGI 入門

デモ

Hokkaido.pm #3

大規模

Page 12: Perl/CGI 入門

デモ

Hokkaido.pm #3

BioPerl

Page 13: Perl/CGI 入門

デモ

Hokkaido.pm #3

科学的

Page 14: Perl/CGI 入門

デモ

Hokkaido.pm #3

Image::Magick

Page 15: Perl/CGI 入門

デモ

Hokkaido.pm #3

芸術的

Page 16: Perl/CGI 入門

デモ

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';

Page 17: Perl/CGI 入門

デモ

Hokkaido.pm #3

呪文のよう

Page 18: Perl/CGI 入門

デモ

Hokkaido.pm #3

Acme::POE::Treeperl -MAcme::POE::Tree -e 'Acme::POE::Tree->new()->run()'

Page 19: Perl/CGI 入門

デモ

Hokkaido.pm #3

魔法のよう

Xmas にひとりでもさみしくないぜ !!

Page 20: Perl/CGI 入門

デモ

Hokkaido.pm #3

ナ カ ーマ

Page 21: Perl/CGI 入門

デモ

Hokkaido.pm #3

友好的

Page 22: Perl/CGI 入門

デモ

Hokkaido.pm #3

まとめサイトから画像をぶっこ抜いてウマー

お小遣い稼ぎサイトで自動クリックさせてウマー

Page 23: Perl/CGI 入門

デモ

Hokkaido.pm #3

美味しい

Page 24: Perl/CGI 入門

デモ

Hokkaido.pm #3

リビドー駆動開発

Page 25: Perl/CGI 入門

デモ

Hokkaido.pm #3

Page 26: Perl/CGI 入門

デモ

Hokkaido.pm #3

Page 27: Perl/CGI 入門

デモ

Hokkaido.pm #3

放送禁止的

Page 28: Perl/CGI 入門

Perl / CGI 入門プログラミング初めての方に送る Perl のインストールから簡単な CGI アプリの作成まで

谷内 元 (keroyonn) / Hokkaido.pm

Hokkaido.pm #3

Page 29: Perl/CGI 入門

自己紹介

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

Page 30: Perl/CGI 入門

本日のお題

Perl と CGI についてやさしくゆるく語ります

プログラムを書いたことがない方でも OK

内容 Perl と CGI について インストール Perl の基本文法 CGI の基本 簡単なアプリを作ってみる

Hokkaido.pm #3

Page 31: Perl/CGI 入門

#1 Perl とは何か

Hokkaido.pm #3

Page 32: Perl/CGI 入門

デモ

Hokkaido.pm #3

Perl とは?

Page 33: Perl/CGI 入門

デモ

Hokkaido.pm #3

Ruby とか PHP とかの LL の始祖

Page 34: Perl/CGI 入門

デモ

Hokkaido.pm #3

LLって何さ?サイズがでかいのかよ ! ?

Page 35: Perl/CGI 入門

デモ

Hokkaido.pm #3

Page 36: Perl/CGI 入門

デモ

Hokkaido.pm #3

違います

Page 37: Perl/CGI 入門

デモ

Hokkaido.pm #3

本当は…

Page 38: Perl/CGI 入門

デモ

Hokkaido.pm #3

Page 39: Perl/CGI 入門

デモ

Hokkaido.pm #3

違います

Page 40: Perl/CGI 入門

デモ

Hokkaido.pm #3

でも何か 6 枚くらいあるらいしいよー

Page 41: Perl/CGI 入門

LL とは

軽量言語 (Lightweight Language)

簡 単: Java や C++ に比べて学習曲線が緩やかつまり覚えやすいってことです

得意分野 :テキスト処理、ネットワーク処理など

苦手分野 :数値計算や画像処理など。苦手分野もモジュール機構を使ってそれが得意な人と連携することである程度克服できる

Perl は発展を遂げ続けており、 perl をまねた後発の言語の良いところをどんどん取り入れている。結果として、どれも良く似ている。人気の言語は多くは大規模サイトでの実績もあり、仕事で使われている

Hokkaido.pm #3

Page 42: Perl/CGI 入門

Perl は他の LL と何が違うの? 柔軟 (TMTOWTDI)

There's more than one way to do it.

厳格 (use strict)コンパイル時に未定義変数チェックとかコーディング規約のチェックとか

変なものに寛容 (Acme)Oppai / モーニング娘

CPAN (膨大なライブラリ群 )

テスト文化Hokkaido.pm #3

Page 43: Perl/CGI 入門

#2 CGI とは何か

Hokkaido.pm #3

Page 44: Perl/CGI 入門

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 アプリ

Page 45: Perl/CGI 入門

CGI の仕組み その 2

Hokkaido.pm #3

WEB サーバーホームページを公開しているプロバイダのコンピューターでは、 WEB サーバーというプログラムが動作しています。これはインターネットの利用者が HTMLファイルを見たいという要求を送ってこないかどうかを常時監視しているプログラムです。

リクエスト /レスポンス利用者が IE などのブラウザで URL を入力すると、 WEB サーバーへそのファイルを見たいという要求をしたことになります。要求を感知した WEB サーバーは、その HTMLファイルをブラウザに送りつけます。

  ブラウザの解釈 /レンダリング

それが HTMLファイルであるうちは問題ありません。 HTMLファイルに書かれる HTML タグや、スタイルシート、 JavaScript はブラウザが解釈・実行できるので、送られてきたファイルを実行すれば終わりです。しかし、要求されたものが CGIファイルであった場合、ブラウザはそこに書かれている特殊な命令が理解できません。

Page 46: Perl/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 をダウンロードし、インストールする必要があります。

Page 47: Perl/CGI 入門

#3 Perl / CGI の制作環境を整える

Hokkaido.pm #3

Perl と WEB サーバーのインストール

Page 48: Perl/CGI 入門

Perl の種類

Hokkaido.pm #3

Active Perl 一番手軽。昔からの Windows での定番 モジュールの管理方法が Unix 環境とかなり違う

Strawberry Perl 手軽で Unix の perl に近い感覚で扱える Larry Wall 氏推奨

Cygwin Linux にそっくり。でも微妙に違う。 導入もそんなに簡単じゃない

本物 (VMWare で Ubuntu など ) 意外と導入が簡単 / OS は GUI でも操作できる 実際の本番環境にそっくりにできる 初心者向け参考書籍がたくさん出ている

Page 49: Perl/CGI 入門

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

Page 50: Perl/CGI 入門

開発用の推奨構成

Hokkaido.pm #3

「わけわからん / とりあえず動かすだけで精一杯」の場合 AN HTTPD + Active Perl

OR AN HTTPD + Strawberry Perl (今日はこれ )

ちゃんと開発するなら 本番環境と同じ構成にします

なので要件しだいです たぶん VMWare などで Linux を動かすことになるでしょう たぶん Apache(mod_perl/mod_fastcgi) か、 Starlet/Starman にな

るでしょう WAF を使った開発になるでしょう。 WAF付属のサーバーも使うことに

なります。 どんなに複雑な構成になったとしても、基礎 /教養として古典的な CGI 開

発は知っておいて損はないでしょう

Page 51: Perl/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

Page 52: Perl/CGI 入門

AN HTTPD のインストール

Hokkaido.pm #3

ダウンロード URL http://www.st.rim.or.jp/~nakata/httpd142p.zip

インストール インストーラはないので、任意のフォルダに解凍します

実行 解凍したフォルダ内の「 httpd.exe 」をダブルクリッ

クします タスクバーの時計の表示されているあたりに黄色いアイ

コンが表示されたら、無事実行されています

Page 53: Perl/CGI 入門

AN HTTPD の設定

Hokkaido.pm #3

時計の横に常駐している ANHTTPD のアイコンを右クリックして「オプション一般( G )」をクリックします

「一般」タブの「ドキュメントルート」を任意の内容に変更します※この設定値が、外部に公開されるファイルの置き場所となります。つまり、 Perl プログラムの保存先となります。

「表示 / インデックス」タブの www.browseable のチェックがついていたら、はずしておきます

Page 54: Perl/CGI 入門

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>";

Page 55: Perl/CGI 入門

CGI の動作確認 その 2

Hokkaido.pm #3

ブラウザから「 http://localhost/ 」にアクセスします

hello.cgi というファイル名がブラウザにあらわれるので、それをクリックします※あらわれない場合は以下をチェックします www.browseable のチェックがついていないこと 「ドキュメントルート」で設定したフォルダにファイルが保存

されていること

HTML 文書が正しくレンダリングして表示されたら、動作テストは完了です

Page 56: Perl/CGI 入門

実行 / デバッグの方法 その 1

Hokkaido.pm #3

入力間違いなどがあった場合に、ブラウザにエラーメッセージが表示されません。 WAF を使った場合には大抵きれいなエラーメッセージが表示されます。 もしくはそのようにプログラムを書けば表示させることもできます。 WAF のような抽象化レイヤを使わないで WEB アプリを書いていいのは、

基本的に勉強するためのコードの時だけ !! WAF 使いたい人は、とりあえず Mojolicious::Lite でググるといい

よ !!!! リーダーが次回懇切丁寧に教えてくれるかもね !!!!! っていうか今日懇親会で石垣さんに訊いてみるといいよ !!!!!!!!!!!!!

僕達は今日初めてプログラミングをする人達なので、コマンドプロンプトを使ってエラーメッセージのチェックを行います。

Page 57: Perl/CGI 入門

(^_^) 「石垣さん」とは何か

Hokkaido.pm #3

Page 58: Perl/CGI 入門

デモ

Hokkaido.pm #3

Page 59: Perl/CGI 入門

実行 / デバッグの方法 その 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>";

Page 60: Perl/CGI 入門

実行 / デバッグの方法 その 3

Hokkaido.pm #3

「スタート」→「プログラム」→「アクセサリ」→「コマンドプロンプト」をクリックする

C:¥>と表示されたら、 cd 半角スペース を入力後、「ドキュメントルート」フォルダをウィンドウ内にドラッグします。

cd “ [ あなたのフォルダ ]” と表示されたら、 Enter キーを押します

perl debug.cgi と入力して Enter キーを押します。エラーが英文で表示されます。メッセージは英文ですが、「 line 7 」のように間違っている箇所の行数が表示されるので間違いを訂正後、再度 perl debug.cgi とします。※エラーが表示されなくなるまで繰り返します。

  エラーが表示されなくなったら、ブラウザから http://localhost/ を表示させ、

debug.cgi をクリックします。正常に表示されることを確認してください。

Page 61: Perl/CGI 入門

#4 Perl の基本文法 1 書き方

Hokkaido.pm #3

Page 62: Perl/CGI 入門

最初の Perl プログラム

Hokkaido.pm #3

Perl プログラムは単なるテキストファイルOS付属の「メモ帳」でプログラムを作ることができます。Eclipse や Visual Studio といった「統合開発環境」は必要としません。

print で「標準出力」標準出力でコマンドプロンプトだけでなく、CGIを使ったブラウザへの出力も可能です。つまり WEBアプリケーションを作ることができます。ファイルに出力することもできますが、今回は扱いません。

細かい書き方 コメント:プログラマの覚書のようなものです。どのような文字も書き込むことができます命令文:組み込み関数。組み込み関数を組合せて自分で関数/命令を作成することもできます引数:命令文に与えるデータです。 文字列:引数には数値と文字列を渡すことができます。文字列はダブルコーテーションで囲んでやる必要があります。 エスケープシーケンス:文字列内には\(バックスラッシュ)で始まる表示制御用の文字列を埋め込むことができます。\n

は改行を表わします。セミコロン:命令文が終了することを表わす区切りの記号です。日本語の「。」と同じです

# Hello World と画面に表示しますprint "Hello World\n";

hello.pl

Page 63: Perl/CGI 入門

組み込み関数

Hokkaido.pm #3

命令の一覧はどこで見れば? 「 perl 関数 リファレンス」で検索すると見ることができます。

PHP との違いPerl の組み込み関数は PHP ほど種類が多くありません。多くの機能はモジュールとして提供されています。たくさんのモジュールが標準で組込まれています。

中級者向けperldoc perlfunc で組み込み関数の一覧を見ることができます。perldoc –f 組み込み関数名で命令の詳細を確認することができます。ただし英語です。日本語もありますが、ちょっとセットアップが難しいです。

試したい方は、「 perldoc 日本語化」で検索すると出てきます。

Page 64: Perl/CGI 入門

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>";

Page 65: Perl/CGI 入門

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回の改行で空行ができる

Page 66: Perl/CGI 入門

引用符のエスケープ その 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'>";

Page 67: Perl/CGI 入門

引用符のエスケープ その 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">!;

Page 68: Perl/CGI 入門

ヒアドキュメント

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 は不要 )

改行は不可

改行必須セミコロン不可

空白不可

任意の文字列でマーク(通常大文字)

Page 69: Perl/CGI 入門

その他の文字列の埋め込みと出力※初めての方は意味が分からなくても大丈夫です

Hokkaido.pm #3

__DATA__ と入力された行以降はプログラムでなく、データとして認識されるため、文字列を設定するのに利用できます。※Data::Section::Simple といったモジュールを利用すると楽に扱うことができます

YAML や INI形式といった設定ファイルを利用して文字列を設定することも多いです

実際には長い文字列は「テンプレートエンジン」と呼ばれる仕組みを使って出力させます。Text::MicroTemplate や Text::Xslate が Perl でテンプレートエンジンの定番です。※今でもヒアドキュメントによる出力がなくなったわけではありません。 SQL 文の埋め込みなどに利用するのに便利です。

Page 70: Perl/CGI 入門

#5 Perl の基本文法 2 変数

Hokkaido.pm #3

Page 71: Perl/CGI 入門

スカラー変数 代入

Hokkaido.pm #3

perl では通常の変数をスカラー変数と呼びます。

$ マークを先頭につけることでそれが単なるアルファベットなのか、変数なのかの判別を行います。

変数名には英数字とアンダースコアを利用することができますが、数字から始まる変数名は使えません。

#!/strawberry/perl/bin/perl$seisuu = 10; # 数値はただ=で代入します$shousuu = -0.8; # 負や小数も利用できます$moji1 = "Hello!"; # 文字は”が必要です。$moji_2 = 'Good morning.'; # ‘ も利用できます。print $moji1;

Page 72: Perl/CGI 入門

スカラー変数 出力

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"; # “ 内の’内では展開されます 

Page 73: Perl/CGI 入門

スカラー変数 計算

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>";

文字列の足し算 ( 連結 ) もできたりします

Page 74: Perl/CGI 入門

配列

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";

Page 75: Perl/CGI 入門

デモ

Hokkaido.pm #3

もの足りない人は、List::Util 、 List::MoreUtils で

ググって !!

Page 76: Perl/CGI 入門

デモ

Hokkaido.pm #3

一応補足。$a と $b は特別な変数です

あんまり気軽に使うと ><

Page 77: Perl/CGI 入門

デモ

Hokkaido.pm #3

さらに補足。こんな便利なものもあるよ !qw(apple orange banana)

Page 78: Perl/CGI 入門

連想配列

Hokkaido.pm #3

$ 変数名 [番号 ] に対して、 $ 変数名 {‘ 文字’ } というように文字を添えて複数のデータを管理できるのがハッシュです。

配列は番号による管理なので、同種のデータをまとめる場合には有効ですが、様々な種類のデータを格納するのには向いていません。多様なデータを扱う場合にはハッシュが向いています。

% を使うことで、一括代入が可能です

通常の変数に {‘ 文字’ } をつけるだけなので、 $a{‘ 文字’ } というような形になります。%a{‘ 文字’ } ではないことに気をつけてください。

算術演算子を使った計算などもスカラー変数と同様に可能です

Page 79: Perl/CGI 入門

連想配列

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";

Page 80: Perl/CGI 入門

#6 Perl の基本文法 3 処理の選択と繰り返し

Hokkaido.pm #3

Page 81: Perl/CGI 入門

処理の選択と繰り返し #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 種類の繰り返し構文が用意されています。 このような構文のことを制御構文と呼びます。 これらに共通して重要なのが、「条件式」です。

Page 82: Perl/CGI 入門

デモ

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

Page 83: Perl/CGI 入門

処理の選択と繰り返し #2if による処理の選択

Hokkaido.pm #3

if 文を利用すると、条件を満している / いない場合に応じて複数の処理からひとつを選択することができます。

else if は elsif と書きます

if( 0 または 1 ){

命令文1 ;

命令文2 ;

}

if( 0 または 1 ){

命令文 ;

}else{

命令文 ;

}

if( 0 または 1 ){

命令文 ;

}elsif( 0 または 1 ){

命令文 ;

}else{

命令文 ;

}

Page 84: Perl/CGI 入門

デモ

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";}

Page 85: Perl/CGI 入門

処理の選択と繰り返し #3while による繰り返し

Hokkaido.pm #3

while を利用することで、同じを処理を何度も繰り返すことができます。

最も一般的な用途で使われる繰り返し命令であり、シンプルであるが故に様々な目的に柔軟に対応できます。

while( 条件式 ){

命令文1 ;

命令文2 ;

}

#!/strawberry/perl/bin/perl# 10回繰り返されるようにしてください$i=0;while(       A       ){

print "$i回目の繰り返しです \n";$i++; # $i=$i+1 と同義。自分自身を加算

する}

Page 86: Perl/CGI 入門

デモ

Hokkaido.pm #3

ループ制御はこうですbreak → last

continue → next??? → continue

後置式の if とラベルのコンボlast ラベル名 if $a == 0;

Page 87: Perl/CGI 入門

処理の選択と繰り返し #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 ;

}

Page 88: Perl/CGI 入門

処理の選択と繰り返し #5foreach による繰り返し

Hokkaido.pm #3

foreach は配列要素を処理するための専用の繰り返し命令です。 配列要素の処理は非常に頻繁に行われるため、そのための専用命令が用意

されました。 指定された配列変数から、配列要素を順番に取り出し、スカラ変数に代入

します。 配列からすべての要素を取り出した時点で自動的に繰り返しが終了するの

で条件式が必要ありません。

foreach スカラ変数  ( 配列変数 ){命令文1 ;命令文2 ;

…}

Page 89: Perl/CGI 入門

デモ

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++;

}

Page 90: Perl/CGI 入門

デモ

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

Page 91: Perl/CGI 入門

処理の選択と繰り返し #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";

Page 92: Perl/CGI 入門

処理の選択と繰り返し #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";

Page 93: Perl/CGI 入門

デモ

Hokkaido.pm #3

map とか grep とか@ret = grep {$_>=50} @tokuten@ret = map {$_ *=2} @tokuten

Page 94: Perl/CGI 入門

処理の選択と繰り返し #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";}

Page 95: Perl/CGI 入門

処理の選択と繰り返し #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";

Page 96: Perl/CGI 入門

デモ

Hokkaido.pm #3

もの足りない人は、List::Util 、 List::MoreUtils で

ググって !!

Page 97: Perl/CGI 入門

処理の選択と繰り返し #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";

Page 98: Perl/CGI 入門

処理の選択と繰り返し #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 } 配列とすると数値の降順

Page 99: Perl/CGI 入門

#7 ファイルの入出力

Hokkaido.pm #3

Page 100: Perl/CGI 入門

デモ

Hokkaido.pm #3

第二部にご期待ください !

Page 101: Perl/CGI 入門

#8 フォーム入力と典型的なデータ処理

Hokkaido.pm #3

Page 102: Perl/CGI 入門

CGI プログラムの流れ #1

Hokkaido.pm #3

CGI プログラムではフォームまたはファイルからデータを受け取り(入力)、それを加工した後でブラウザまたはファイルに出力します。また、CGI プログラム自身にデータを埋め込むこともできます。

ブラウザブラウザCGICGI

ファイルファイル

ブラウザブラウザ

ファイルファイル

入力 出力加工

Page 103: Perl/CGI 入門

CGI プログラムの流れ #2

Hokkaido.pm #3

■アクセスカウンタにおける処理入力 アクセス回数が記録された 1行のテキストファイルを読み取り、変数に代入 加工 その変数を 1 つ加算する。さらに HTML形式に整形する 出力 加算した結果をテキストファイルに上書きし、さらにブラウザにも出力

■掲示板における処理入力 フォームから投稿されたデータを変数に入力(最新の記事) 入力 ファイルに保存されている過去の記事を配列に入力(古い記事) 加工 フォームのデータとファイルのデータを結合し、配列に入力(全記事) 出力 全記事が揃った配列をカンマ区切り形式でファイルに上書き保存 出力 配列を 1件ずつ繰り返しながら table形式で整形表示

■商品の注文フォームにおける処理入力 注文フォームで入力された商品データを変数に入力 加工 金額などを計算し、見積もりを作成 出力 注文データをファイルに追加保存 出力 見積もりを HTML で生成して出力 出力 注文があったことをメールで管理者に出力

Page 104: Perl/CGI 入門

フォームデータの入力 #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 プログラムにユーザーの入力データが渡ります。

Page 105: Perl/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(フォーム名 ) で値が取得できます

Page 106: Perl/CGI 入門

簡単な 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;

Page 107: Perl/CGI 入門

フォームデータの処理 #1

Hokkaido.pm #3

フォームからの取得したデータは、データベースやテキストファイル(CSV形式など ) に保存することができます。

その際に様々な問題が起きるため、回避するの工夫が必要になります。

問題の例 何も入力していない状態でもデータが追加されてしまった 郵便番号を入力すべき箇所に日本語が入力されてしまった 半角の数値と全角の数値がまざってしまった 不正な命令を入力されてセキュリティが侵害されてしまった 複数行入力すると、データが壊れてしまった (CSV形式の場合 ) 漢字コードを変換しないと文字化けして表示されてしまった 同じデータを何回も追加できてしまった などなど

Page 108: Perl/CGI 入門

デモ

Hokkaido.pm #3

きりがないのでひとつだけ

Page 109: Perl/CGI 入門

フォームデータの処理 #2改行コードの置換処理

Hokkaido.pm #3

textarea を利用した複数行入力フィールドなどで、複数行の入力を行った場合、改行マークも同時に保存されるため、テキストファイルのフォーマットが崩れます。

そこで改行マークを発見したら、< BR> タグに置き換えるという作業が必要になります。

検索処理 if( 変数名 =~ /検索文字列 /){}

「検索文字列」を発見すると 1 が返り、 if の条件が満たされることになります。変数の中に「検索文字列」を含んでいればよいので、変数と「検索文字列」が完全に一致している必要はありません。

if( 変数名  !~ /検索文字列 /){}「検索文字列」が変数に含まれなかった場合に条件が満たされます。

Page 110: Perl/CGI 入門

フォームデータの処理 #3改行コードの置換処理

Hokkaido.pm #3

置換処理 スカラ変数 =~ s/検索文字列 / 置換文字列 /g;

「検索文字列」を発見したら、それを「置換文字列」に置き換えます。g は発見されたすべての文字列を置換するという意味になります。g をつけなかった場合には最初に見つかった文字列を置換すると、終了します。

例. 変数 =~ s/\r\n|\r|\n/<br>/g;\r\n は Windows の、 \r は Macintosh の、 \n は UNIX の改行コードを表します。「|」は「または」を表し、3つのコードのうちどれか一つを見つけたらという意味になります。

Page 111: Perl/CGI 入門

フォームデータの処理 #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;

Page 112: Perl/CGI 入門

デモ

Hokkaido.pm #3

正規表現はまた今度 !

Page 113: Perl/CGI 入門

#8 まとめ

Hokkaido.pm #3

Page 114: Perl/CGI 入門

デモ

Hokkaido.pm #3

今回できなかったことリファレンス関数

正規表現CPAN/便利モジュール

ネットワークプログラミングオブジェクト指向

モダンPerlベストプラクティスセキュリティ

LinuxApachePlackWAF

AKB48…

Page 115: Perl/CGI 入門

デモ

Hokkaido.pm #3

千里の道も一歩から

今後の Hokkaido.pm の活動にご期待ください

Page 116: Perl/CGI 入門

ご清聴ありがとうございました

Hokkaido.pm #3