ブログトップ 記事一覧 ログイン 無料ブログ開設

サンプルコードによるPerl入門 〜 Perlで楽しくプログラミングを学ぼう 〜

3000-01-01

サンプルコードによるPerl入門 - 目次からすべての記事が観覧できます

 サンプルコードを中心としたPerlの入門サイトです。応用的な話題もたくさん扱っているので、Perlを詳しく学びたい方にはおすすめのサイトです。サンプルコードによるPerl入門では、現代的なPerlの記述を行うように心がけています。筆者は木本裕紀(きもとゆうき)といいます。

 仕事や学校でPerlを使う初学者の方にぜひサンプルコードによるPerl入門を教えてあげてください。気に入った記事がありましたらはてなブックマークもお願いします。ブックマークボタンとツイートボタンが各記事の右下についています。コメントやトラックバックも受け付けています。

(スマートフォン、タブレットの場合のサンプルコードによるPerl入門のPCサイト表示はこちらから行うことができます)

Perl基礎

 Perlの基礎について解説します。Perlのインストール、基本的な構文、配列、ハッシュ、正規表現、ファイル入出力、オブジェクト指向などを学ぶことができます。


  1. コマンドプロンプト- コマンドプロンプトの使い方
  2. Perlとは - Perlの特徴について
  3. Perlインストール - Perlのインストール方法
  4. Perl基礎文法最速マスター - Perlの基礎をすばやく学習
  5. 現代的なPerlの記述方法 - Perlの現代的な書き方
  6. 実践で役立つPerl正規表現 - Perlの正規表現で頻繁に利用するテクニック
  7. 配列とハッシュを自由に扱う - ハッシュと配列の扱い
  8. サブルーチンの作成 - サブルーチンの作成方法
  9. Perlのスコープを理解する - スコープという概念を学習
  10. ファイル入出力の基礎 - ファイルの読み書き
  11. Perlオブジェクト指向入門 - オブジェクト指向の入門
  12. デバッガの手引き - デバッガの紹介
  13. Perl豆知識 - 知っておくと便利な豆知識
  14. Perl FAQ - Perlでよくある質問に答える

Mojolicious入門

 Mojolicious入門 〜 Perlで楽しくWebアプリケーションを作ろう 〜
Perlを学ぶ楽しい方法のひとつはWebアプリケーションを作成してみることです。Webアプリケーションを作成できれば、自分でWebサービスを公開することもできます。MojoliciousというWebフレームワークを使って、PerlでWebアプリケーションを開発する方法を解説しています。

Perl書籍

 Perl関連の書籍の紹介です。「サンプルコードによるPerl入門基礎編」「簡単プログラミング Perl/CGI」と「もっと自在にサーバを使い倒す 業務に役立つPerl」は僕が書いています。

Perl応用

 基礎を学び終えたら、関数とモジュールについて知るのが、上達の近道です。よく使用する関数や、モジュールについて解説しています。またデータベース操作についても学ぶことができます。

  1. よく使用する関数一覧 - よく使用する関数の紹介
  2. Perlモジュール徹底解説 - モジュールについての詳しい解説
  3. Validator::Customリファレンス - HTMLフォームのバリデーション
  4. SQLiteで学ぶデータベース操作の基礎 - SQLiteとDBIを使ったデータベース操作
  5. DBIx::Customリファレンス - データベースに便利にアクセス
  6. PDLによる統計解析 - PDLモジュールを使った統計解析
  7. Perlその他の情報

Perlリファレンス

Perl逆引き辞典

 逆引き辞典です。やりたいことをさがせます。簡単なサンプルつきです。

コメントデバッグコマンドライン引数配列
ハッシュサブルーチンモジュール数値演算
ビット演算文字列文字コード正規表現
ファイルとディレクトリファイルとディレクトリ(UNIX系OS)ファイル入出力制御構造
変数情報取得日付と時刻開発環境構築
特殊変数プラグマワンライナーPerlとMySQLの連携
自動試験プロセス間通信ソケットオブジェクト指向

Perlその他

CentOS・Red Hat Linux実践テクニック

Perl以外の技術情報

2014-04-22

Perlの資産を生かしたい場合はMojoliciousを使えばいいと思う

 Perlのライブラリの資産を生かしながら、新しいWebサイトを作る場合はMojoliciousを使うのがよいと思います。こうすれば、Perlというひとつの言語を管理しながら、Webサイトの部分だけをアップデートすることができます。

 すべてを書き換えるという作業は、とてもとても大変な労力なので、利用できる部分については利用して、新しくできる部分は新しく置き換えるのがいいと思います。

 Perlであれば環境の管理もとても楽です。ひとつのPerlのバージョンで、古い資産も新しい資産も両方動かすことができます。このアプリならこのバージョンでなければ、このアプリならこのバージョンでなければという苦労をしないですみます。

 アプリひとつのために、OSを含めた環境ごと準備するというのは、管理作業という面で、非常に面倒な作業であると僕は思います。作業を楽にしたかったはずなのに、気づけば、いろんなツールで環境がごちゃごちゃになってしまっている。初めて管理作業をする人は、覚えることがいっぱいで、わけがわからない、そんな苦労があると思います。

 Perlであれば、ひとつのバージョンで、すべてをシンプルに保てます。Perlは汚いといわれますけれど、広い範囲で見れば、環境を含めて、多くのことをシンプルに保てます。周辺分野で苦労が少ない。そういう言語だと思います。

2014-04-21

フォームの利用 / Mojolicious入門

 ユーザーからのデータを受け取るには、フォームを利用します。フォームの使い方を学びましょう。

簡単なフォーム

 まず最初に簡単なフォームを作成してみましょう。テキストボックス、ラジオボタン、テキストエリアに値を入力してもらって、受け取って表示するプログラムを作成してみます。

use Mojolicious::Lite;

# トップページ
get '/' => sub {
  my $self = shift;
  
  $self->render('index');
};

# データを受け取って処理
post '/' => sub {
  my $self = shift;
  
  # パラメーターの取得
  my $name = $self->param('name');
  my $private = $self->param('private');
  my $message = $self->param('message');

  # メッセージがない場合はトップページを表示
  unless (length $message) {
    $self->render('index', error => 'Message is empty');
    return;
  }
  # フラッシュに保存
  $self->flash(name => $name);
  $self->flash(private => $private);
  $self->flash(message => $message);
  
  $self->redirect_to('/');
};

app->start;

__DATA__

@@ index.html.ep
<%
  my $error = stash('error');
%>

% if ($error) {
  <div style="color:red">
    <%= $error %>
  </div>
% }

<form action="<%= url_for %>" method="post" style="border:1px solid gray">
  <b>Form</b><br>
  <b>Name:</b> <%= text_field 'name' %><br>
  <b>Private:</b> Yes<%= radio_button private => 1 %> / No <%= radio_button private => 0, checked => 'checked' %><br>
  <b>Message:</b><br>
  <%= text_area 'message', style => "width:400px; height:100px" %><br>
  <input type="submit" value="Post">
</form>

<div>
  <b>Name</b>: <%= flash('name') // '' %><br>
  <b>Private</b>: <%= flash('private') // '' %><br>
  <b>Message</b>: <%= flash('message') // '' %>
</div>

 このプログラムを実行して、フォームに値を入力してPostボタンを押すと、画面に入力した内容が表示されます。画面の下の部分は次のように表示されると思います。

Name: kimoto
Private: 0
Message: Hello

 このプログラムはサンプルのプログラムです。本来ならばユーザーから受け取ったデータは、データベースに保存します。まだデータベースについては解説していませんので、データを保存せずに、そのまま表示するプログラムにしています。

 プログラムの各部分を解説します。

# トップページ
get '/' => sub {
  my $self = shift;
  
  $self->render('index');
};

 これはトップページを表示するルーティングの記述です。いつもどおりの記述です。このページにフォームを記述します。

フォームの記述

フォームは以下のようになっています。

<form action="<%= url_for %>" method="post" style="border:1px solid gray">
  <b>Form</b><br>
  <b>Name:</b> <%= text_field 'name' %><br>
  <b>Private:</b> Yes<%= radio_button private => 1 %> / No <%= radio_button private => 0, checked => 'checked' %><br>
  <b>Message:</b><br>
  <%= text_area 'message', style => "width:400px; height:100px" %><br>
  <input type="submit" value="Post">
</form>

 formタグの中にはactionmethodstyleという属性がありますね。style属性はスタイルシートを設定するもので、フォームを囲む枠を設定しています。

 フォームでデータを送信するときには、一般的にはmethodにpostを指定します。postを指定すれば、どんなに大きなデータであっても送信することができます。getを指定した場合は、フォームの値はURLのクエリ文字列として送信されますが、postを指定した場合は、HTTPボディと呼ばれる部分に記述されて、送信されます。

 actionには処理をするURLを指定します。今回は同一のURLにしました。同一のURLにしておくと簡単です。

 フォームの部品を使う部分でtext_fieldヘルパー、radio_buttonヘルパー、strong>text_areaヘルパーを使用しています。

  <b>Name:</b> <%= text_field 'name' %><br>
  <b>Private:</b> Yes<%= radio_button private => 1 %> / No <%= radio_button private => 0 %><br>
  <b>Message:</b><br>
  <%= text_area 'message', style => "width:400px; height:100px" %><br>

 これらは、タグヘルパーと呼ばれます。タグヘルパーのドキュメントは、Mojolicious API リファレンスのMojolicious::Plugin::TagHelperの解説から見ることができます。

 タグヘルパーは、以下のような実際のタグに展開されます。

<form action="/" method="post" style="border:1px solid gray">
  <b>Form</b><br>
  <b>Name:</b> <input name="name" type="text" /><br>
  <b>Private:</b> Yes<input name="private" type="radio" value="1" /> / No <input name="private" type="radio" value="0" /><br>
  <b>Message:</b><br>
  <textarea name="message" style="width:400px; height:100px"></textarea><br>
  <input type="submit" value="Post">
</form>

 タグヘルパーを使うと便利な一番の理由は、フォームを送信した後でも、フォームの値を復元してくれることです。

 今回は、メッセージが入力されていない場合は、エラーメッセージを表示するようにしているのですけれど、その場合にでも、フォームの値が保存されます。

フォームの処理

 次にフォームを処理する部分です。

# データを受け取って処理
post '/' => sub { ... };

 


Mojolicious入門

2014-04-16

IOの負荷をかけているプロセスを調べるためのツール piotop

 topコマンドのように、実行中のプロセスとプロセスのreadとwriteのI/OをBpsでリアルタイムで表示するツールpiotopというのがGitHubで公開されています。

-- Every 3 sec --
 13:59:10 up 13 days, 15:28, 11 users,  load average: 0.22, 0.05, 0.01
 pid   state            read         write        command          cwd_path
 1818  S (sleeping)     0bps         1Mbps        kjournald        /
 13314 S (sleeping)     21Kbps       32Kbps       rsync            /backup
 13312 D (disk sleep)   21Mbps       0bps         rsync            /
 13313 D (disk sleep)   20Mbps       0bps         rsync            /backup
 21561 S (sleeping)     0bps         0bps         bash             /root
 1788  S (sleeping)     0bps         0bps         kmpathd/0        /

Linux上でプロセス毎のI/Oを調査するツール piotop.pl をさらに改造

piotop(GitHub)

 Perlのツールなので、Perlのどのバージョンがインストールされているかを気にせずに利用できるので便利です。cpanmを利用するパッチを送って適用してもらったので、セットアップもコマンド一発でできます。

 こういうのが、Perlのもっとも便利な側面なので、みなさんもPerlで、ばしばしアプリケーションを作りましょう。どんな環境でも簡単に使ってもらえるアプリができます。


Perlで作成されているアプリケーション

2014-04-14

テンプレートヘルパー | Mojolicious入門

 テンプレートで利用すると便利なヘルパーについて解説したいと思います。ヘルパーとは、テンプレート内で呼び出すことのできる関数のようなものだと考えてください。layoutヘルパー、stashヘルパーについては、すでに解説していますので、それ以外のヘルパーについて解説します。

スタイルシートの埋め込み

 テンプレートの中にスタイルシートを記述したい場合はstylesheetヘルパーを使用します。beginendで囲った部分にスタイルシートを書きます。

%= stylesheet begin
  body {
    background:blue;
  }
% end

 通常の方法でstyleタグを使って書いてもよいのですが、こちらのほうが簡潔ですし、汎用性のあるタグに展開されるので便利です。以下のようなタグに展開されます。

<style>/*<![CDATA[*/

  body {
    background:blue;
  }

/*]]>*/</style>

 またpublicディレクトリにあるスタイルシートをstylesheetヘルパーで読み込むことができます。

%= stylesheet '/css/common.css';

 これは次のように展開されます。

<link href="/css/common.css" rel="stylesheet" />

JavaScriptの埋め込み

 テンプレートの中にJavaScriptを記述したい場合はstylesheetヘルパーを使用します。beginendで囲った部分にJavaScriptを書きます。

%= javascript begin
  alert('Hello');
% end

 通常の方法でscriptタグを使って書いてもよいのですが、こちらのほうが簡潔ですし、汎用性のあるタグに展開されるので便利です。以下のようなタグに展開されます。

<script>//<![CDATA[

  alert('Hello');

//]]></script>

 またpublicディレクトリにあるJavaScriptをjavascriptヘルパーで読み込むことができます。

%= javascript '/js/common.js';

 これは次のように展開されます。

<script src="/js/common.js"></script>

アプリケーションオブジェクトの取得

 アプリケーションオブジェクトを取得するにはappヘルパーを使用します。

% my $app = app;

コントローラーオブジェクトの取得

 テンプレートの中では$selfという名前で、コントローラーオブジェクトを参照することができます。

% my $c = $self

 これを使って、テンプレートの中でHTTPメソッドを取得することなどができますね。

% my $http_method = $self->req->method;

データのダンプ

 データの内容をダンプするためのdumperメソッドが用意されています。これは機能的にはData::DumperモジュールのDumper関数と同じです。

% warn dumper $date;

他のテンプレートの取り込み

 includeヘルパーを使うと他のテンプレートを取り込むことができます。

%= include '/include/header.html.ep

 ヘッダやフッタなどは、サイトで共通なことが多いですので、これらを作っておいて、複数のテンプレートから読み込むと便利です。includeヘルパー第二引数以降を利用することで、スタッシュの値を設定することができます。

%= include '/include/header.html.ep, name => 'kimoto', age => 34;

URLの表現

 Mojoliciousではアプリケーションの内部的なURLを表現する場合は、パフォーマンスが重要になるアプリケーションを除いてurl_forヘルパーを使用するようにしてください。たとえば「/date/20131215」というURLを表現したい場合は次のように記述します。

<a href="<%= url_for('/date/20131215') %>">2013/12/15</a>

 url_forメソッドを使うのは、アプリケーションに汎用性を持たせるためです。このように記述しておけば、CGIとして起動しても、サーバーとして起動しても、URLが汎用的になります。

 これは次のように展開されます。

# CGIの場合
<a href="/myapp.cgi/date/20131215">2013/12/15</a>

# サーバーとして起動した場合
<a href="/date/20131215">2013/12/15</a>
Mojo::URLオブジェクト

 url_forヘルパーで取得するのはMojo::URLオブジェクトです。Mojo::URLクラスはURLを扱うためのクラスです。

 Mojo::URLオブジェクトを文字列化するためにはto_strongメソッドを使うか、文字列として評価します。

% my $url_str = url_for->to_string;
% my $url_str = "" . url_for;

 最初の例では「<%= %>」の中は、文字列として評価されるために単純に

<%= url_for('/some') %>

 と書くだけで、URLが文字列として展開されます。

現在のURLを取得

 url_forヘルパーで引数を指定しなければ、現在のURLを取得することができます。

% my $current_url = url_for

クエリ文字列

 url_forヘルパーで注意しておきたいのは、引数なしで現在のURLを取得する場合は、クエリ文字列を除いた部分のURLを取得できるということです。もしクエリ文字列を含めたURLを取得したい場合は<string>url_withヘルパーを利用します。

<%= url_with %>

 たとえば「/some?name=kimoto&age=30」というURLをアクセスした場合はurl_forヘルパーでは「/some」を取得しますがurl_withヘルパーであれば「/some?name=kimoto&age=30」を取得できます。

 クエリの部分はMojo::Parametersオブジェクトに保存されています。これはMojo::URLクラスのqueryメソッドで取得できます。

my $query = url_with->query;

 またqueryメソッドは、クエリ文字列を設定する機能もあわせてもっています。クエリ文字列を設定するには以下の三種類の方法があります。最初のクエリ文字列が「title=perl&name=ken」だったと想定してください。

クエリ文字列を置き換える

 クエリ文字列を置き換えるには次のようにリスト形式で渡します。

$url->query(name => 'taro', price => 1900);

 上記の例の場合は以下のように置き換わります。

# 前
title=perl&name=ken

# 後
name=taro&price=1900
クエリ文字列のマージ

 クエリ文字列をマージするには配列のリファレンスとして渡します。

$url->query([name => 'taro', price => 1900]);

 次のようにマージされます。値が同じものは置き換えられます。

# 前
title=perl&name=ken

# 後
title=perl&name=taro&price=1900
クエリ文字列の追加

 クエリ文字列を追加するにはハッシュのリファレンスとして渡します。

$url->query({name => 'taro', price => 1900});

 次のように追加されます。

# 前
title=perl&name=ken

# 後
title=perl&name=ken&name=taro&price=1900

 Webアプリではページ番号だけを差し替えたいという要望が強いと思います。そういう場合は、クエリのマージの機能を使うのがよいでしょう。

<%= url_with->query([page => $page]) %>

テンプレートヘルパーを利用したサンプル

 今回解説したテンプレートヘルパーを使ったサンプルコードを書いてみます。

use Mojolicious::Lite;

get '/person' => sub {
  my $self = shift;
  
  # パラメーター
  my $name = $self->param('name');
  my $age = $self->param('age');
  
  # 描画
  $self->render('index', name => $name, age => $age);
};

app->start;

__DATA__

@@ index.html.ep
<%
  # スタッシュの値
  my $name = stash('name');
  my $age = stash('age');
  
  # ログの取得
  app->log->info('Template Helper');
  
  # HTTPメソッド
  my $http_method = $self->req->http_method;
  
  # データのダンプ
  my $data = [1, 2, 3];
  warn dumper $data;
%>
<html>
  <head>
    <title>Template Helper</title>
    %= stylesheet '/css/common.css';
    %= javascript '/js/common.js';
  </head>
  <body>
    %= include '/include/header';
    
    Name: <%= $name %><br>
    Age: <%= $age %><br>
    Current URL: <%= url_with %><br>
    Current URL with some change: <%= url_with->query([name => 'ken']) %>
    %= include '/include/footer';
  </body>
</html>

public/css/common.css

 CSSファイルを「public」ディレクトリの中に配置しましょう。「public/css/common.css」という名前で保存してください。文字色変更する設定などが書いてあります。

#header h1 {
  color:green;
  border-bottom:1px solid gray;
}

#footer {
  color:red;
  border-top:1px solid gray;
  text-align:center;
}
public/js/common.js

 JavaScriptファイルを「public」ディレクトリの中に配置しましょう。「public/js/common.js」という位置においてください。「Hello」と表示するダイアログを実行するJavaScriptです。

alert('Hello');
ヘッダとフッタ

 ヘッダとフッタを作ってみましょう。「templates」ディレクトリの中に、「templates/include/header.html.ep」と「templates/include/footer.html.ep」という名前で保存してください。

templates/include/header.html.ep

<div id="header">
<h1>Template Helper</h1>
</div>

templates/include/footer.html.ep

<div id="footer">
Author kimoto
</div>
アプリケーションの実行

 このアプリケーションを実行して「/person?name=kimoto&age=32」でアクセスしてみてください。上部にヘッダ、下部フッタが、挿入されています。コンテンツの内容として以下が表示されます。

Name: kimoto
Age: 32
HTTP Method: GET
Current URL: /person?name=kimoto&age=32
Current URL with some change: /person?age=32&name=ken


Mojolicious入門