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

サンプルコードによるPerl入門 〜 安定と信頼のPerlを学ぼう 〜

3000-01-01

サンプルコードによるPerl入門 - 目次

 サンプルコードを中心としたPerlの入門サイトです。 Perlを使ったWebサイトの作り方も解説しています。関数やモジュールなPerlの便利な機能の解説も行っています。(スマートフォン、タブレットの場合のPCサイト表示はこちらから行うことができます)

Perl基礎 - 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入門 - PerlでWebサイトを作ろう

 Mojolicious入門 〜 PerlでWebサイトを作ろう 〜
Perlを学ぶ楽しい方法のひとつはWebサイトを作成してみることです。Webサイトを作成できれば、インターネット上で自分でサービスを公開することもできます。

 MojoliciousはPerlでWebサイトを作る場合の代表的なフレームワークです。Mojoliciousを使えば、簡単にWebサイトを作成することができます。Ruby on Railsを知っている方は、これのPerl番だと考えていただけると想像しやすいと思います。

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プログラマのためのC言語入門 - PerlプログラマのためのC言語の解説です
  8. XSによるC/C++バインディング入門 - PerlからC言語あるいはC++で書かれた関数を呼び出します
  9. Perlその他の情報

Perlリファレンス

Perl逆引き辞典

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

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

Perlその他

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

Perl以外の技術情報

2014-11-18

正規表現を利用する | XSによるC/C++バインディング入門

 XS正規表現を使う方法を解説します。ただし、現在、Perlのドキュメントに使用方法が解説されていないので、試し試しでやっているので、間違っていたら教えてください。

正規表現のコンパイル

 XSで正規表現を使用するにはまずpregcomp関数を使って、正規表現をコンパイルする必要があります。これは、正規表現のリファレンスを作成する操作に対応すると考えてください。

# Perl
my $re = qr/[0-9]+/;

# XS (pregcompの第二引数は正規表現のフラグ)
SV* sv_re_str = newSVpv("[0-9]+", 0);
REGEXP* sv_re = pregcomp(sv_re_str, 0);

 REGEXP*型は、SV*型の一種ですので、実際にコードを利用するときはsv_2mortalを使って、自動的にメモリが解放されるようにしましょう。実際のコードで利用するのを想定して書くと次のようになります。

SV* sv_re_str = sv_2mortal(newSVpv("[0-9]+", 0));
REGEXP* sv_re = (REGEXP*)sv_2mortal((SV*)pregcomp(sv_re_str, 0));

正規表現のフラグ

 正規表現のフラグを、pregcompの第二引数に指定することができます。

# Perl
my $re = qr/abc/im;

# XS
SV* sv_re_str = newSVpv("[0-9]+", 0);
REGEXP* sv_re = pregcomp(sv_re_str, RXf_PMf_FOLD | RXf_PMf_MULTILINE);

 フラグの対応は以下です。複数指定する場合はビット演算子の論理和「|」で、フラグをつなぎます。

/mRXf_PMf_MULTILINE
/sRXf_PMf_SINGLELINE
/iRXf_PMf_FOLD
/xRXf_PMf_EXTENDED

正規表現の実行

 正規表現を実行するにはpregexec関数を使用します。pregexec関数の引数は、とても複雑です。

/* pregexec - 文字列に対して正規表現をマッチさせる。 */
I32
pregexec(
  REGEXP * const prog, /* コンパイルされた正規表現 */
  char* stringarg,     /* 文字列のマッチを開始する位置 */
  char *strend,        /* 文字列の終端(NULLポインタの位置) */
  char *strbeg,   /* 文字列の開始位置 */
  SSize_t minend, /* stringarg後のマッチの終端がminend以上でなければならないバイト数 */
  SV *screamer,   /* 文字列をあらわすSV: utf8フラグのためだけに利用される */
  U32 nosave      /* キャプチャしない場合は1を設定 */
)

 マッチが成功した場合は戻り値に真が返ります。サンプルを記述しておきます。

SV* sv_value = sv_2mortal(newSVpv("  12", 0));
char* value = SvPV_nolen(sv_value);

SV* sv_re_str = sv_2mortal(newSVpv("^ *([-+]?[0-9]+) *$", 0));
REGEXP* sv_re = (REGEXP*)sv_2mortal((SV*)pregcomp(sv_re_str, 0));

IV ret = pregexec(
  sv_re, // コンパイルされた正規表現
  value, // 検索開始位置
  value + strlen(value), // 文字列の終端(NULLポインタ)
  value, // 文字列の頭
  0, // 0でOK
  sv_value, // SV*型の文字列
  0 // 0でOK
);

マッチした文字列の取得

 マッチした文字列を取得するにはPerl_reg_numbered_buff_fetch関数を使用します。(非公開のAPIしかないのかな)

# Perl
my $match1 = $1;
my $match2 = $2;

# XS
SV* sv_match1 = newSVpv("", 0);
Perl_reg_numbered_buff_fetch(aTHX_ sv_re, 1, match1); 

SV* sv_match2 = newSVpv("", 0);
Perl_reg_numbered_buff_fetch(aTHX_ sv_re, 2, match2); 


XSによるC/C++バインディング入門

2014-11-17

PerlのO/Rマッパー DBIx::Customの便利さ case式も使える

 DBIx::Customは、素のSQLっぽく書けるので、case文を使うことも可能など、非常に柔軟な設計になっています。where句を動的に生成しながら、さらに、SQLの自由な文を組み合わせて使えるのが、DBIx::Customの特徴になっています。

 case式も組み合わせて使うことができます。

# 価格帯ごとの数を取得
my $case = <<"EOS";
case
  when KAKAKU < 2000 then '2000un'
  when KAKAKU >= 2000 and KAKAKU < 3000 then '2000'
  when KAKAKU >= 3000 and KAKAKU < 4000 then '3000'
  when KAKAKU >= 4000 and KAKAKU < 5000 then '4000'
  when KAKAKU >= 5000 then '5000ov'
else null end
EOS

my %bukken_counts = $dbi->model('book')->select(
  ["$case kakaku", 'count(*)'],
  where => $where,
  append => "group by $case"
)->flat;

2014-11-12

mop minus proposal

 Github上でmop-minus-proposalというプロジェクトを作っている。現状の実験的なmopの実装はコアの変更の負担が大きすぎると感じている。そこで、コアの変更なしに、書きやすい形のオブジェクト思考の支援ができたらどうだろうと思った。

mop-minus-proposal

 サンプルは以下のとおりで、これは、単なる仕様ではなくって、実際にPerl 5.20.1以上で、実行できます。そして、大切な点として、このコードにおいて、ソースフィルタを一切使っていません。

# Point.pm
package Point {
  use mop::minus;

  has x = 0;
  has y = 0;

  # will be "method clear { ... }"
  sub clear ($self) {
    $self->x(0);
    $self->y(0);
  }
}

1;

# Point3D.pm
package Point3D {
  use mop::minus;

  extends Point;
  with Role1, Role2;

  has z = 0;

  # will be "method clear { ... }"
  sub clear ($self) {
    $self->z(0);
  }
}

1;

# Role1.pm
package Role1 {
  use mop::minus;

  # will be "method foo { ... }"
  sub foo {
    return 'foo';
  }
}

1;

# Role2.pm
package Role1 {
  use mop::minus;

  # will be "method bar { ... }"
  sub bar {
    return 'bar';
  }
}

1;

# main.pl
use Point3D;
my $point = Point3D->new;
print $point->x(0);
my $x = $point->x;

 少し解説。以下はPerl 5.12で追加されたキーワードAPIという機能を使って実装しています。元来のPerlでは、Perlの言語機能として、「キーワード ほにゃらら」という構文を解析することはできませんでしたが、キーワードAPIという機能を使うことによって、解析することができるようになりました。

has x = 0;
extends Point;
with Role1, Role1;

 次はパッケージブロック構文。これもPerl 5.14で追加された機能で、package 名前 { ... } という形で記述することができます。

# Role2.pm
package Role1 {
  ...
}

 次はサブルーチンシグネチャ。Perl 5.20で実験的についかされた機能でsub ($foo) { ... } のように、利用することができます。将来的には、メソッドシグネチャが追加されれば、さらに、自然な形でメソッドを書くことができるのでうれしいです。

# will be "method clear { ... }"
sub clear ($self) {
  $self->z(0);
}

2014-11-11

GitPrep 1.9をリリースしました - コミットログのAtomフィードのサポート、短いSSLのURLのサポート

 Githubのクローン、ポータブルなGithubシステムをUnix/LinuxにインストールできるWebアプリケーショGitPrepの1.9をリリースしました。

 自分のサーバーインストールできるので、ユーザーの作成は無制限、プライベートリポジトリも無制限に作成することができます。GitPrepはオープンソースですので、無料で利用することができます。さくらレンタルサーバーなどの共有レンタルサーバーにインストールすることができます。

GitPrep (リポジトリとドキュメント)

 1.9では以下の機能を追加しました。

 1.9では、ssh_rep_url_baseオプションによって、公開鍵認証を使っている場合には、完全にホームディレクトリを隠すことができます。たとえば、以下のようにURLをできます。

ssh://gitprep@59.106.185.196:55555/kimoto/gitprep_t.git

 そしてAtomフィードを追加したので、他の人のコミットをRSSリーダなどによって、チェックすることができるようになりました。

 どうぞ、便利にご利用ください。

サンプル

 動いているサンプルはこちらです。さくらのレンタルサーバーのスタンダードで動かしています。こちらでアプリケーションを試すことができます。

GitPrepを試す

ダウンロード

https://github.com/yuki-kimoto/gitprep/archive/latest.zip

ドキュメント

GitPrep ドキュメント


技術ニュースへ