すがブロ

sugamasaoのhatenablogだよ

モダン perl 入門以前

perl を書く上でのメモ

ちょいと仕事で、perl で作成されたツールに対して、ちょっと手を入れてくれ!という依頼があったので、数年降り(学生時代以来だよ!)に perl を触る事になった。

自分で調べたこと

package

文字通りパッケージ。クラス名として使う事もある。
おそらく以下のような使い分けのように思う(なんかあんまり詳しい説明が見当たらなかった)。

  • Package::Method の形式で呼ぶ場合はパッケージ(Ruby で言うところの module相当)
  • Package->Method の形式で呼ぶ場合はクラス(メソッドの第一引数にパッケージ名が代入される)
ライブラリパス

use とか require は @INC とやらのパスしか読んでくれないので、自前のライブラリ等、格納場所が別の場所の場合はロードパスを明示してあげる必要がある。
こんな感じで、 use lib PATH としてやる。

use lib "./";
usr hoge;

hoge->method;

ただ、これだとパスが明示的になってしまって嫌だし、実行時のパスに依存してしまう。
だもんで、このように書く(perl のお作法的にどうなんだろう?)

# 既存パッケージ群
use File::Basename;
  :

# 自作パッケージン群
use lib dirname(__FILE__);
use hoge;

hoge->method;

__FILE__ には実行したスクリプトのパスが入っているので、そこから dirname でディレクトリだけ抜き出すようにしている。
この例ではパッケージが実行スクリプト自身と同じディレクトリにある事が前提だったけど、例えば lib/ にあるような場合は以下のようにすれば良い。

use lib dirname(__FILE__) . "/lib";
定数について

use constant を使う。

use constant hoge => "ZZZ";

print hoge . "\n";
print "@{[hoge]}" . "\n";

普通の変数と同じような感じだけど、$ が付かない。また、ダブルクォートのリテラル内で使うには @{[xxx]} とする。

プライベートメソッド

慣例的に、先頭にアンダースコアを付けたメソッド名を付ける。実際にアクセス権限を付ける機構が組み込まれているかはよくわからん\(^o^)/
なんか private.pm なるものはあるみたいだが。

すぐ忘れることその1

.pm モジュールのように、別ファイルから読み込まれるファイルは最後に

1;

とする。よくわからないけれど、ファイルを正常に読み込まれた事を明示するらしい。ちなみに __END__ はファイルのこれ以上下は解釈してくれるな、という意味らしい。

すぐ忘れることその2

文末にはセミコロンが必要。

その他

実行時の例外(ファイルパーミッションエラー等)の時は eval{ 〜 }; if($@){} で例外処理をできるようだけれど、そういうケースと関数の戻り値で成否の判定をするケースの区別がイマイチ付かない(API見ろよ)。

perl を使ってみた感想

なんとなく、 C++ を彷彿とさせる。なんというか、愚直(シンプル)な文法に対してオブジェクト指向用の文法をつぎはぎしていったような感じだ。
というか、やはり後発の強みということで(?) ruby の方が素直にクラスとか書けて楽ですね\(^o^)/