2006-01-01から1年間の記事一覧

あなたがブログで勉強日記をつけるべき6つの理由

正規表現はほんの基礎しか解説しないつもりだったのに、ここ数日どんどん解説してしまいます。(笑) でも、他の人にわかるように書く事で、自分の理解が深まる気がします。こういったブログのようなパブリックなスペースでは、常に人の目を意識しなくてはいけ…

正規表現(3) 検索オプション /o

昨日に引き続き、Perlでの正規表現を勉強します。検索パターンは「m//」演算子で記述できるのでした。 m/Apple|Banana/ このパターンの場合、「Apple」「Banana」にはマッチしますが、「apple」や「BANANA」にはマッチしません。パターンは大文字小文字を厳…

正規表現(4) 検索オプション /m

他にも色々な検索オプションがあります。正規表現の中で「^」(サーカムフレックス)と「$」(ドル記号)はそれぞれ「文字列の先頭」「文字列の末尾」という意味を持っています。 use strict; $_ = "One Two Three Four Five"; print "$_\n"; print (/^One/ …

正規表現(1) 基礎知識

Perl の正規表現を勉強します。実のところ、僕は既に正規表現を他の言語で勉強したので、知っています。(^_^) でも、基礎知識を復習します。「正規表現」(regular expression)とは、文字列の中に「パターン」を見出して、文字列処理を抽象化できる、とても…

正規表現(2) 検索パターン

Perl で正規表現検索パターンを記述するには、前後を「m/」と「/」で囲みます。「m」は省略できます。 m/Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/ # m// 各種Windowsを検索 /Windows (3\.1|95|98|NT|Me|2000|XP|2003|Vista)/ # 上と同じ意味 文字列…

Ajaxイン・アクション欲しい!

プレゼント応募です。Perl は関係ないですね。(^_^;;) Ajax は JavaScript で XMLHttpRequest や Microsoft.XMLHTTP などを使って行なうブラウザ上での非同期通信です。ページの遷移が無い、使いやすいインターフェースが作れます。 JavaScript も面白いスク…

strict プラグマ

今までこの勉強日記に書いていたスクリプトには、strict プラグマを使っていませんでした。(プラグマ=use すると Perl の動作自体を変える事ができるモジュール) 短いコードばかりだったので、その必要もないかな、と思っていたのです……が、 iandeth. - P…

アクセサ(4) Class::Accessor

CPANからのインストールも済んだので、Class::Accessorの使い方を勉強します。 といっても、使い方はとっても簡単です。Class::Accessor を継承すれば mk_accessors というクラスメソッドが使えるようになります。このメソッドに「属性名のリスト」を渡せば…

CPAN

アクセサ(3) クロージャでアクセサ - ぱるも日記 Class::Accessor や Class::Data::Accessor については後日じっくり勉強したいと思います! という事で、勉強しようと思い、とりあえず「perldoc Class::Accessor」(Class::Accessor のドキュメントを表示す…

アクセサ(3) クロージャでアクセサ

先日の AUTOLOAD アクセサに関して id:fbis さんから言及を頂きました♪(初トラックバック!) アクセサの作り方のまとめ - Unknown::Programming アクセサの作成方法はいろいろあるけど自作するならAUTOLOADとか使わずに、 package Hoge::Class; use strict…

Class::Struct

もう少し現実的なアクセサメソッドの自動生成をするには……、とラクダ本を読んでみたら、標準モジュール Class::Struct が紹介されていました。C言語の構造体のような、簡単なデータクラスを作ってくれるモジュールです。 簡単な、といっても、かなり柔軟に作…

アクセサ(1) アクセサメソッド

オブジェクトがそれぞれ持っている変数の事を「属性」や「プロパティ」などと呼びますが、後からの変更に強くするため、こういった属性に外部からアクセスする時には、「アクセサ」と呼ばれるメソッドを通しますよね。 例えば C++ なら「obj」の「name」属性…

アクセサ(2) AUTOLOAD でアクセサ

普通にアクセサメソッドを宣言していたのでは、無駄が多いのが難点でした。 1つ考えたのが、AUTOLOADで存在しないメソッドが呼ばれたらアクセサとする方法です。 package Person; sub new { my $class = shift; my $self = { name => "Somebody", age => 0, …

OOP(6) AUTOLOADで英文を作る

存在しないメソッドが呼ばれた場合、UNIVERSALに定義されている可能性があるというのは勉強しましたが、実は他にもエラーにならない可能性があります。 それが AUTOLOAD (オートロード)と呼ばれる機能で、呼ばれたメソッドが見つからない時、代わりに AUTO…

メソッドサーチ

UNIVERSAL や AUTOLOAD を勉強しましたが、ラクダ本に書かれている「Perl がメソッドを探す順番」(メソッドサーチの順番)をまとめてみます。 use Student; my $palmo = Student->new(); $palmo->doit(); を実行した際に、Perl が doit メソッドを探す時の…

UNIVERSAL::can

UNIVERSALは全てのクラス共通の祖先ですが、それを利用して UNIVERSAL クラスに定義されている便利なメソッドを、どんなオブジェクトからでも呼び出す事ができます。 UNIVERSAL::can は、指定したメソッドのリファレンスを得る事ができます。もしメソッドが…

UNIVERSAL::isa

便利なメソッド UNIVERSAL::isa は、呼び出しに使ったオブジェクトのクラスが、指定したクラスと同じクラス、または継承しているか(is-a の関係かどうか)を確かめる事ができます。 例えば $a->isa("B") と書いた場合、$a オブジェクトが B クラスのオブジ…

OOP(5) 共通祖先 UNIVERSAL

use Student; my $palmo = Student->new(); $palmo->doit(); というコードが書かれているのにもかかわらず、Student クラスに doit メソッドが定義されていない時、C++などのOOP言語ではコンパイルエラーとなりますが、Perl ではエラーにならない場合があり…

OOP(4) 擬似パッケージ SUPER

メソッドのオーバーライドについては昨日勉強しましたが、今日はオーバーライドされたメソッド(親クラスのメソッド)にアクセスする方法を勉強します。 例えば、以下のようなクラスを作ったとします。 package Speaker; sub new { my ($class, $name) = @_;…

OOP(3) 継承

パッケージ変数である @ISA 配列に、親となるクラス(パッケージ)の名前を入れておけば、そのクラスを継承した事になります。(is-a の関係) メソッドが呼び出された時、そのメソッドが見つからなければ @ISA 配列の中の親クラスが持っていないか探してく…

OOP(1) 祝福あれ!(bless)

Perl でのオブジェクト指向プログラミング(OOP)を勉強します。といっても、Perl には(JavaやC++のように)オブジェクト指向用のキーワードなどは存在せず、全てがPerlの通常の言語仕様の範囲でまかなわれているとの事。面白そうです。 C言語などの手続き…

OOP(2) メソッド

では実際にクラスを作る前に、メソッドの呼び出し方を勉強しておきます。 メソッドの呼び出し方には2種類あって Doggy->eat("dogfood"); eat Doggy("dogfood"); は同じ意味です。これは Doggy クラスのクラスメソッドを呼び出す方法ですね。(後者はなんだか…

シンボリックリファレンス

一昨日の日記でリファレンスには「ハードリファレンス」と「シンボリックリファレンス」という2種類がある、と書きました。今まで扱っていたのはハードリファレンスの方です。 シンボリックリファレンスといっても中身は単純な文字列で、文字列をデリファレ…

型グロブ 再び

過去の日記で勉強した型グロブでしたが、型グロブとリファレンスの関係を勉強していく内に、型グロブの代入について書いたコードが動かなかった原因が判明しました。 まず、前回書いたコードを再掲します。 # typeglob.pl my $hoge = "This is hoge string!"…

型グロブとリファレンス

というわけで、型グロブとリファレンスについて勉強します。型グロブ「*hoge」は「$hoge」や「@hoge」や「%hoge」など同じ名前で違う種類の変数の総称でしたね。 型グロブにハッシュのように *変数名{型名} とアクセスすると、その型の変数へのリファレンス…

無名関数(クロージャ)

無名配列や無名ハッシュと同じように、無名の関数(サブルーチン)へのリファレンスも簡単に作成する事ができます。 無名で関数が作れると何が便利なんでしょうか。 例えば、微分のように返り値として関数を生成して返す関数(高階関数)を作りたい場合、関…

カリー関数

関数を返す関数(高階関数)を作ってみます。お題は、関数の引数を束縛する(カリー化する)関数です。 # curry.pl sub curry { my $func = shift; my @arg = @_; return sub { return $func->(@arg, @_); } } my $printer = sub { print "@_\n"; }; $printe…

リファレンス(1) 基本

値を間接的に参照したい時、Perlでは「リファレンス」という機能を使います。リファレンスを直訳すると「参照」です。そのまんまですね。(^_^;) 「間接的に参照」できると何が便利か。例えば変数間の関係性を表したり、1つの値を複数の変数で共有したり、関…

リファレンス(2) 簡単な使い方

値のリファレンスを作成する(値をリファレンスする)には、値の頭に「\」(ASCII環境だとバックスラッシュ、日本語環境だと円マーク)を付けるだけです。 my $ref1 = \$a; # $ref1 は $a のリファレンス my $ref2 = \@b; # $ref2 は @b のリファレンス my $…

リファレンス(3) 無名配列、無名ハッシュ

(ハード)リファレンスは、値を直接参照するものなので、変数ではなく値からリファレンスを作る事ができました。 Perl には便利な構文があって、無名な配列へのリファレンス、無名なハッシュへのリファレンス、無名な関数へのリファレンスをそれぞれ簡単に…