2006-05-01から1ヶ月間の記事一覧

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 には便利な構文があって、無名な配列へのリファレンス、無名なハッシュへのリファレンス、無名な関数へのリファレンスをそれぞれ簡単に…

スマイル!

2次元配列の練習の為に、スマイルマークを表示するプログラムを作ってみました。 # smile.pl my $smile = [ [ 0, 0, 1, 1, 1, 1, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 1, 0 ], [ 1, 0, 1, 0, 0, 1, 0, 1 ], [ 1, 0, 1, 0, 0, 1, 0, 1 ], [ 1, 0, 0, 0, 0, 0, 0, 1 ]…

名前空間(2) package

大規模なプログラムを作る時に絶対に必要となる名前空間というものがあります。 プログラムを多人数で作ったり、モジュールに分割したりする時、皆がみんな好き勝手に変数を使って関数を定義していると、どうしても名前が衝突してしまいます。 「名前空間」…

モジュールの基本

1度書いたコードは再利用しなきゃもったいないですよね。同じ処理を何度も書いていたり、コピーアンドペーストしていたら、手間がかかりすぎます。 そういった再利用しそうなコードを書く時、Perlでは「モジュール」と呼ばれるファイルを作るそうです。コー…

ハッシュ(1) ハッシュの基礎

少し余裕がでてきたので、2歩下がってハッシュを勉強します。どうやらPerlとハッシュは切っても切れない縁があるようです。 元々ハッシュは連想配列(Associative array)と呼ばれていたのですが、タイプするのが面倒だという理由でハッシュ(Hash)と呼ぶよ…

ハッシュ(2) ハッシュとループ

今度はハッシュの中にある値をそれぞれループで処理したいと思います。 最初は foreach $value (%hash) でできるかと思い、以下のように書いてみました。 # hash2.pl my %capital_city = ( Japan => 'Tokyo', USA => 'Washington', England => 'London', ); …

ハッシュ(3) 要素の操作

ハッシュ内の要素(キーと値のペア)を操作する関数を調べます。 まずは要素の削除から。ハッシュ内の特定の要素を削除するには delete 関数を使います。 # hash6.pl my %tastes = ( pepper => 'hot', cake => 'sweet', lemon => 'sour', ); sub eat { for (…

おっとっと

昨日はちょっと遠出していてお休みしました。(^_^) ではでは、はりきって続けます!

関数定義(1) 構文

やっぱり自分で関数を定義したいので、Perlでの関数定義する方法を調べてみました。 Perl ではユーザが定義した関数の事をサブルーチンとも呼ぶらしいのですが、どちらも全く同じ意味との事なので、僕は「関数」で統一したいと思います。 関数を使うと、処理…

関数定義(2) 引数を受け取る

今度は引数を付けて呼び出してみます。 調べてみて驚いたのですが、Perl には仮引数(渡された引数に関数側で名前をつける機構)は存在しないんですね! 引数はデフォルト配列変数 @_ にリストとして格納される、と。そして、引数はいくつでも指定できる(可…

関数定義(3) 返り値を返す

次に、返り値を返してみます。 返り値は return で返せるらしいです。引数の渡し方とはうってかわって、こちらはおなじみですね。(^_^; 以下、「perldoc -f return」の引用です。 return EXPR return Returns from a subroutine, "eval", or "do FILE" with …

フィボナッチ数列

なんだか色々な所で書かれている、フィボナッチ数列のN番目の項を返す関数を作ってみます。 フィボナッチ数 - Wikipedia フィボナッチ数列のN番目の項は、N-1番目の項と、N-2番目の項を足す事で求める事が出来ます。N-1番目の項を求めるには、更にN-2番目の…

名前空間(1) 型グロブ

今まで勘違いしていたのですが、変数の名前空間は変数名の頭に付ける記号ごと(スカラー変数、配列、ハッシュ、関数など)で独立しているので、同じ名前で違う種類の変数を使うと全く別の変数として扱われるんですね。 これはつまり「$hoge」「@hoge」「&hog…

変数の有効範囲

今までのPerlスクリプト中で変数を宣言する時に「my」というキーワードを使っていましたが、これが何かを調べました(ToDoにしてたのに遅くなっちゃった……)。 結論から書きますと、「my」というのはそのスコープのローカル変数を宣言する為のキーワードでし…

スコープ付き変数宣言

スコープ付きで変数を宣言するには「my」の他に「our」と「local」が使えるそうです。 「our」は、ラクダ本を読んでも意味がよくわからなかったのですが、結局の所「グローバル変数を明示的に宣言・使用するための手段」という事でいいのでしょうか。 our $F…

はてな日記ブログモードだと…

大見出し(*)に自動的に p1、p2、p3……と識別子(name)が付けられていきますが、はてダラで日記を書いていると1つ問題がありました。 1日中の新しい見出しは上方向に追加しているのですが(下に行くほど古くなる)、識別子が上から p1、p2、p3……と割り振ら…

制御構文(3) for

for といえばお馴染みのループ構文ですね。初期化式、条件式、再初期化式という3つの式を指定して、与えたブロックを繰り返す事ができます。 # fortest.pl my @fruits = ("apples", "oranges", "bananas"); for (my $i = 0; $i < @fruits; $i++) { print "I …

制御構文(4) foreach

for を勉強した後にマニュアルを眺めていたら foreach を見つけました。といっても、実は foreach と for は同じ意味らしいですが。 foreach を使うと、配列の要素に1つずつアクセスできます。 foreach $スカラ変数 (@配列) { ブロック } と書く事で、@配列…

制御構文(5) next, last, redo

nextとlastは、C言語でいうcontinueとbreakにあたります。Perlの構文はC言語に似ているので間違えそうです。(-_-; nextは、ループのブロックの途中からループの先頭に戻る事ができます。この際、whileやuntilの継続条件式、forの条件式・再初期化式は評価さ…

ラクダ本

Perlの書籍といえば「ラクダ本」と呼ばれるオライリー社の「プログラミングPerl 改訂版」が有名、という事でしたので買ってきました。 Perl作者のLarry Wall氏も執筆に参加しているんですね。(^_^) パラパラと読んでみましたが、文章がユーモアに溢れていて…