Hippo2000 (2000/7/28)
URI::fileモジュールなのです。
作者はGisle Aasさんです。メールで許可をいただきました。
URI::file - ローカル・ファイル名に対応するURI
use URI::file;
$u1 = URI->new("file:/foo/bar";);
$u2 = URI->new("foo/bar", "file");
$u3 = URI::file->new($path);
$u4 = URI::file->new("c:\\windows\\", "win32");
$u1->file;
$u1->file("mac");
URI::fileクラスはfileURIスキームに所属するURIオブジェクトをサポートします。このスキームはさまざまなコンピュータシステム上で見つかった従来のファイル名を、URI名前空間に対応づけることを可能にします。fileスキームの古い仕様はRFC1738にあります。いくつかのより古い背景情報はRFC1630にもあります。私が知る限りより新しい仕様はありません。
URI文字列からfileURIオブジェクトを単純に組み立てたいのであれば、通常のURIコンストラクタを使ってください。さまざまなシステムによって使われる実際のファイル名からileURIオブジェクトを組み立てたいならば、以下のURI::fileコンスタラクタの1つを使ってください。
URI::file->new($filename)->abs(URI::file->cwd);
以下のメソッドはfileURIのためにサポートされています。(URIで記述されている共通と汎用メソッドに加えて)
指定されたファイルシステムでは表現することができなければ、undefを返すかもしれません。
URI::fileモジュールは汎用のファイル名を現在のシステムにあった名前に対応づけるために使うことができます。そのような場合、File::Specモジュールの代わりとして動くことができます。例えば以下のコードはUnix形式のファイル名 Foo/Bar.pmをローカル・システムにあった名前に変換します:
$file = URI::file->new("Foo/Bar.pm", "unix")->file;
die "Can't map filename Foo/Bar.pm for $^O" unless defined $file;
open(FILE, $file) || die "Can't open '$file': $!";
# do something with FILE
今日のほとんどのコンピュータシステムは階層的に組織されたファイルシステムを持っています。これらのシステムから汎用URI書式で使われる対応づけは、(RFC2396で定義されている)URIのための汎用アルゴリズムを使って解決されるとき、そうするべきであるように振る舞う相対ファイルURIと一緒に作業することを可能にします。
ファイル名から汎用URI書式への対応づけはパス区切り文字を"/"に対応づけること、ファイル名のパス・セグメントにあらわれる予約れた文字のすべてをエンコーディングすることを含みます。"."や".."が入っているパス・セグメントが汎用URIに指定されているものとは違う意味を持っていれば、これらもエンコードされなければなりません。
ファイルシステムがデバイス、ボリュームまたはドライブ指定を名前空間のルートとして持っていれば、汎用URI書式のauthorityフィールドへそれらが対応づけることを意味します。相対URIは、これにより"上に"解決されないことはないこと、つまり一般的に相対ファイル名はそれらのシステムで機能することを保証します。
authorityフィ−ルドの一般的な他の使い方は、このファイル名が適正であるホストをエンコードすることです。ホスト名"localhost"は特別で、一般的にauthorityフィールドがないか、空であるのと同じ意味を持ちます。この使い方はデバイスの指定として使うこととぶつかりますが、デバイス名がプレーンなホスト名では正しくない文字を持っていることにより解決されることが多くあります。
ファイル名からURIへのマッピングは通常1対1ではありません。通常たくさんのURIが同じファイル名に対応づけられます。例えば、"localhost"のauthorityはauthorityがなかったり、空だったりするURIと同じように対応づけられます。
例1:Macは":"を区切り文字として使いますが、一般的なURIとは同じ方法ではありません。":foo"は相対名です。"foo:bar"は絶対名です。またパス・セグメントには"/"や"."、".."を入れることができます。それは以下のように対応づけられます。
Mac URI ---------- ------------------- :foo:bar <==> foo/bar : <==> ./ ::foo:bar <==> ../foo/bar ::: <==> ../../ foo:bar <==> file:/foo/bar foo:bar: <==> file:/foo/bar/ .. <==> %2E%2E <undef> <== / foo/ <== file:/foo%2F ./foo.txt <== file:/.%2Ffoo.txt 注意:もし相対URLが欲しければ、パスは:から始めなければ*いけません*。 [^:](:以外)から始まるパスは絶対として扱われます。
例2:Unixファイル・システムはURIと同じパス区切り文字を使っていて、1つのルートを持ち、"."と".."のセグメントが同じ意味を持つので、対付けが簡単です。文字"\0"や"/"をパス・セグメントの一部として持っているURIは正しいUnixファイル名にすることはできません。
Unix URI ---------- ------------------ foo/bar <==> foo/bar /foo/bar <==> file:/foo/bar /foo/bar <== file://localhost/foo/bar file: ==> ./file: <undef> <== file:/fo%00/bar / <==> file:/
URI, File::Spec, perlport
Copyright 1995-1998 Gisle Aas.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。