続・はじめてのPerl 3章

今日もまとめ

3章 モジュールの使い方

3.1 標準ディストリビューション
ポピュラーなモジュールは、すでにPerlに付属されている
    5.003_07 98個
    5.8.8    359個
        これらを「コアモジュール」または、「標準ディストリビューション」と表す

    Module::CoreListを使い、コアモジュール数を数えることが出来る
3.2モジュールの使い方
モジュールにはドキュメントが付属されている
    perldocコマンドで、モジュールのドキュメントを閲覧出来る
        perldoc File::Basename

    ドキュメントは、UNIXのman形式
        NAMEセクションと、SYNOPSISセクションから始まる
            SYNOPSIS = 概要
                モジュールの使用例を示す

    モジュールのインターフェイスは様々な形がある
        モジュールによって使い方は少しずつ異なる
3.3 関数インターフェイス
モジュールの読み込み
    useディレクティブを使う
        → 10章、15章で詳しく説明

use File::Basename;
    ロードすると、3つのサブルーチンがインポートされる
        fileparse
        basename
        dirname

    すでに、dirnameサブルーチンが実装されていた場合
        File::Basenameが実装しているdirnameで上書きされる
            警告を有効にしていれば、警告が表示される
3.4 インポートする関数を選ぶには
インポートリスト
    インポートされるサブルーチンを制限する
        useディレクティブを使用するときに、
        モジュール名の後に読み込むサブルーチン名リストを付ける
            use File::Basename qw( fileparse basename );
                fileparseとbasenameがインポートされる
                dirnameはインポートされない

            use File::Basename ( 'fileparse', 'basename' ); でも同じ
                メンテナンス性が落ちるので、qw()を使い指定するのがベター

インポートしなかったサブルーチンを使うには?
    完全なパッケージ名と共に指定する
        my $dirname = File::Basename::dirname( $path );

    インポートリストで指定したサブルーチンに対しても同様に使える
        my $basename = File::Basename::basename( $path );

空のインポートリスト
    use File::Basename qw( );
        何もインポートされない
            qw()を付けない場合は、「デフォルトを下さい」という意味
3.5 オブジェクト指向インターフェイス
File::Specモジュール
    オブジェクト指向インターフェイスを持つ
        サブルーチンはインポートされない

    File::Specクラスのクラスメソッドcatfileを呼び出すコードサンプル
        my $filespec = File::Spec->catfile(
            $homedir{gilligan},
            'web_docs',
            'photos',
            'USS_Minnow.gif',
        );

    このモジュールは、移植性の高い形でファイルパスを操作するメソッドを提供する
        → 移植性に関しては、perlportドキュメント参照
3.6 より典型的なオブジェクト指向モジュール : Math::BigInt
File::Specモジュールは、オブジェクトを持っていない
    オブジェクト指向言語には見えない

Math::BigInt
    Perlネイティブで扱えるものより大きい整数を処理できる
# モジュールは何もインポートしない
use Math::BigInt;

# newはクラスメソッド
#   クラス名から、新しいインスタンス生成
my $value = Math::BigInt->new( 2 ); # 初期値2

# bpowとbstrはインスタンスメソッド
#   インスタンスのデータ操作を行う
$value->bpow( 1000 );               # 2**1000
print $value->bstr(), "\n";         # 表示
3.7 CPAN
CPAN
    Comprehensie Perl Archive Network : 総合Perlアーカイブネットワーク

    CPAN Search(http://search.cpan.org/) で出来ること
        ・モジュールの検索
        ・ドキュメントの閲覧
        ・ディストリビューションの閲覧
        ・CPANテスタレポートの閲覧
        ・など!
3.8 CPANのモジュールをインストールするには
インストール手順
    ダウンロードし、解凍して、そのディレクトリに移動
        $ wget http://www.cpan.org/.../HTTP-Cookies-Safari-1.10.tar.gz
        $ tar -xzf HTTP-Cookies-Safari-1.10.tar.gz
        $ cd HTTP-Cookies-Safari-1.10s

    Makefile.PLを使いインストール
        $ perl Makefile.PL
        $ make
        $ make test
        $ make install

        システム全体のディレクトリにインストールされる
            インストールされるディレクトリは、Perl -V で確認可能
                このディレクトリは、管理者がPerlをインストールするときに設定される

            インストールする権限がない場合
                PREFIX引数を使い、別のパスにインストールすることが可能
                    $ perl Makefile.PL PREFIX=/home/tyamaguc07/perl/lib

    Build.PLを使いインストール
        $ perl Build.PL
        $ perl Build
        $ perl Build test
        $ perl Build install

        Build.PLがある場合、コードのビルドとインストールに、Module::Buildを使用している
            Module::Buildは Perl 5.9.4 からコアモジュール
                $ corelist -a Module::Build

                それ以前のバージョンでは、ディストリビューションのインストールのために、
                Module::Buildをインストールする必要がある

        インストールディレクトリを指定するには、--install_base パラメータを指定する
            $ perl Build.PL --install_base /home/tyamaguc07/perl/lib

    ディストリビューションによっては、Makefile.PL Build.PL 両方用意されている
        好きな方を使っていい

環境変数 PERL5LIB
    指定したディレクトリを、モジュールディレクトリサーチリストに加える
        $ export PERL5LIB=/home/tyamaguc07/perl/lib

libプラグマ
    モジュールサーチパスを追加する
        #!/user/bin/perl
        use lib qw( /home/tyamaguc07/perl/lib );

    問題点
        ・コードを書き換える必要がある
        ・別のマシンで、モジュールが同じディレクトリにあるとは限らない
3.9 適切なタイミングでパスを設定するには
Perlは、特殊変数@INCに含まれるディレクトリからモジュールを探す
    use文はコンパイル時に実行
        したがって、@INCもコンパイル時に参照される

@INCにパスを追加する
    use文がコンパイル時に実行された後、unshiftが実行されるため、
    以下の方法では、use文が実行されるタイミングでパスは追加されない
        unshift @INC, '/home/tyamaguc07/perl/lib';
        use MyModule;

    use文が実行される前に@INCを書き換えるには、BEGINブロックを使用する
        BEGIN { unshift @INC, '/home/tyamaguc07/perl/lib'; }
        use MyModule;

        BIGINブロックは、コンパイル時にコンパイルされ実行される。

    BEGINブロックより libプラグマを使うべき
        use lib qw( /home/tyamaguc07/perl/lib );
        use MyModule;

    libプラグマ
        ・1つ以上の引数を取り、unshiftと同様に@INCの先頭に追加
        ・ほとんどの場合、サイト依存のパス名に対して使用される
            変更への対応のしやすさから、ファイルの先頭で使うのが伝統的
        ・「このライブラリを使え」ではなく、「このパスを使ってライブラリとモジュールを探せ」
            以下のようなコードは間違い
                use lib qw( /home/tyamaguc07/perl/lib/MyModule.pm );
        ・コンパイル時に実行される
            以下のようなコードは使えない
                my $LIB_DIR = '/home/tyamaguc07/perl/lib';
                ...
                use lib $LIB_DIR;
                use MyModule;

            このような方法を取りたい場合は…
                ・BEGINブロックを使い、$LIB_DIRを定義する
                    BEGIN { our $LIB_DIR = '/home/tyamaguc07/perl/lib'; }
                    ...
                    use lib $LIB_DIR;
                    use MyModule;

                ・use constant を使い、定数の設定を行う
                    use constant LIB_DIR => '/home/tyamaguc07/perl/lib';
                    ...
                    use lib LIB_DIR;
                    use MyModule;
3.9.1 モジュールの依存関係を処理するには
依存関係の問題
    モジュールをインストールのために、別のモジュールがインストールされている必要がある
        依存関係がネスト構造になっていることもある
            CPAN.pm モジュールを使って楽にインストール

CPAN.pm
    Perl5.004以降、標準ディストリビューションに含まれる

    対話的なモジュールインストールシェルを提供

    指定したモジュールのダウンロード、解凍、ビルド、テスト、インストール
        依存関係にあるモジュールについても再帰的に同じことを行う
            $ perl -MCPAN -e shell
            cpan> install CGI::Prototype

    CPANモジュールを使うための仕事は少し多すぎる
        より簡単に使うために、cpanスクリプトが提供されている
            インストールしたいモジュールのリストを与えるだけ
                $ cpan CGI::Prototype HTTP::Cookies

CPANPLUS.pm
    CPAN.pmを完全に書き直した物

感想

ほぼ復習。
でも、分かっていることでも文章に起こそうとすると時間がかかる。
モダンなモジュールのインストール方法は、cpanmを使うことだよね。

続・初めてのPerl 改訂版

続・初めてのPerl 改訂版