Path::Class - クロスプラットフォームでのパス指定の操作
use Path::Class; my $dir = dir('foo', 'bar'); # Path::Class::Dirオブジェクト my $file = file('bob', 'file.txt'); # Path::Class::Fileオブジェクト # Unixでは'foo/bar'、Windowsでは'foo\bar'などに文字列化 print "dir: $dir\n"; # Unixでは'foo/bar.txt'、Windowsでは'foo\bar.txt'などに文字列化 print "file: $file\n"; my $subdir = $dir->subdir('baz'); # foo/bar/baz my $parent = $subdir->parent; # foo/bar my $parent2 = $parent->parent; # foo my $dir2 = $file->dir; # bob
# 外部パスを指定した時の動作 use Path::Class qw(foreign_file foreign_dir); my $file = foreign_file('Mac', ':foo:file.txt'); print $file->dir; # :foo: print $file->as_foreign('Win32'); # foo\file.txt # 基本的なファイルシステムとの対話: # $dir_handleはIO::Dirオブジェクト my $dir_handle = $dir->open or die "Can't read $dir: $!"; # $file_handleはIO::Fileオブジェクト my $file_handle = $file->open($mode) or die "Can't read $file: $!";
Path::Classファイルとディレクトリ指定操作(文字列でそのロケーションを記述すると'/home/ken/foo.txt'あるいは'C:\Windows\Foo.txt'などとなるような)をクロスプラットフォームの作法で行うためのモジュールです。
Unix、Windows、Mac、VMS、Epoc、Cygwin、OS/2、そしてNetWareを含む、Perlが動くほとんどあらゆるプラットフォームをサポートします。
また、よく知られているFile::Specモジュールもこのサービスを提供しますが、使い勝手にちょっと不恰好な部分があり、しばしば利用しなかったり、当人がテストしたものとは大きく異なったプラットフォームでは実際には動作しない方法で使ったりする人もいます。
実際、Path::Classは内部ではFile::Specを使用し、見栄えの悪い細かな部分をラッピングしますので、利用者は自分のアプリケーション・コードに集中できます。
File::Specは共通的なパス操作のための関数を提供しますが、Path::Classはそれらの基本的な意味論の世界からのオブジェクト指向のモデルを提供します。
File::Specは一切のオブジェクトを作成しませんし、このクラスは各種のプラットフォームで異なった(そして非常に直感的でないコンセプトの)パスの操作方法を提示します。
Path::Classはファイルおよびディレクトリをあらわすオブジェクトを作成し、これらを相互に関連付けたメソッドを提供します。
例えば、次のようなFile::Specコード:
my $absolute = File::Spec->file_name_is_absolute( File::Spec->catfile( @dirs, $file ) );
はPath::Classを以下のように使って、
my $absolute = Path::Class::File->new( @dirs, $file )->is_absolute;
あるいは以下のように使って書くことができます。
my $absolute = file( @dirs, $file )->is_absolute;
Path::Classを使用すると、同様の読み易さの改善がいたるところで起こるでしょう。
Path::Classの使用が、あなたのコードの本当の問題 - 例えば、File::Specを使ったコードの書き込み時に、何人が実際に``volume''(WindowsでのC:のような)を自分のアカウントに取り込んでいるか - を解決する助けにもなるでしょうか?
そうはならないでしょう。
しかし、Path::Classを使うと、ファイルおよびディレクトリオブジェクトが、自身がどのボリュームを参照しているかを把握し、正しい振る舞いをするようになるでしょう。
Path::Classコードの肝は、Path::Class::FileおよびPath::Class::Dirモジュールに息づいていますので、使い方の詳細についてはこれらのドキュメントをお読み下さい。
以下の関数がデフォルトでエクスポートされます。
このエクスポートをやめさせるには、useに明示的に空のリストを渡して、つまりuse Path::Class ().のようにしてください。
以下はオンデマンドでエクスポートされます。
Path::Class::File->new_foreignの別名です。
Path::Class::Dir->new_foreignの別名です。
このモジュールではクロスプラットフォームにやさしいコードをFile::Specよりずっと簡単にかけますが、まだいくつか、注意すべき問題があります。
いくつかのプラットフォーム、特記すべきものとしてはVMSや、いくつかの古いバージョンのDOS(多分)では、全てのファイル名に拡張子が必要です。 このため、foo/barというファイルを作成し、それからディレクトリfoo内のファイルリストを問い合わせると、予想されるbarの代わりに、bar.というファイルが見つかるでしょう。 したがって、初めての場所では拡張子を使うというのが良い考え方でしょう。
Ken Williams, KWILLIAMS@cpan.org
Copyright (c) Ken Williams. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Path::Class::Dir, Path::Class::File, File::Spec
Makio Tsukamoto, tsukamoto@gmail.com