[解決済み] ディレクトリで終わるパスに対してcatfileを使用した場合の危険性?
質問
は
File::Spec
モジュールは、クロスOSの有効なパスを作成する方法を提供します。これは期待通りに動作します。
use strict;
use warnings;
use File::Spec;
my $file = 'ghi.xml';
my $path = File::Spec->catfile(('abc', 'def'), $file);
print $path;
# Windows: abc/def/ghi.xml
メソッド
catdir
は、ファイルへのパスではなく、ディレクトリを生成することもできます。
私の問題点は、事前に
$file
はファイル名なのかディレクトリ名なのか。私がテストした限りでは、代わりにdirnameを使用しても結果は正しいです、例えば。
use strict;
use warnings;
use File::Spec;
my $file = 'ghi';
my $path = File::Spec->catfile(('abc', 'def'), $file);
print $path;
# Windows: abc/def/ghi
しかし、これではいずれにせよ問題が発生するのではないか。私が想定しているのは はい なぜなら、モジュールの作成者がなぜ同じ機能のために2つのインターフェイスを構築したのか理解できないからです。しかし、ドキュメントにはそれ以上の説明が見当たりません。
を使っても大丈夫ですか?
catfile
を使用して、ディレクトリだけでなく、ファイルへのパスも作成できますか?そうでない場合、注意点は何ですか?
解決方法は?
の違いは
catdir
と
catfile
は通常非常に小さい(
使用するOSに依存します
). UNIXでは
catfile
が行います。
catdir
の場合は、とにかく
ディレクトリ
要素を追加し (例えば、最後の (file) の部分を除いて)、その後に
ファイル
の部分です。また
catdir
は、パスクリーンのロジックを実行します。Windowsプラットフォームでは、その差はさらに小さくなります。
を確認することができます。 異なるOSのモジュールのソースコード を自分で作る。
これらのルーチンは、ファイルシステムへのアクセスは行わず、論理パスのクリーニングを行うだけということです。
代替品です。
他のOS-esをUNIXライクに気にしない場合(例:Linux、FreeBSD、Mac OS X etc..) そして Windowsは、個人的には パス::タイニー モジュールです。そのドキュメントから。
このモジュールは、ファイル パスがあります。File::Specよりも使い勝手がよく、また簡単に 他のいくつかのコアファイル処理モジュールの関数にアクセスすることができます。それは は、CPAN上の多くの代替品よりも小さく高速であることを目指し、同時に は、多くの一般的な事柄を一貫して、より少なく行えるよう支援します。 エラーを起こしやすい方法です。
Path::Tiny は、Unix 系と Win32プラットフォーム。
IMHO - これはCPANの中で最高のモジュールの一つで、本当の宝物です。例えば、パスの作成には
child
メソッドがあります。
$file = path("/tmp")->child("foo.txt"); # "/tmp/foo.txt" $file = path("/tmp")->child(@parts);
元のオブジェクトからの相対的な新しい Path::Tiny オブジェクトを返します。次のように動作します。
catfile
またはcatdir
は、File::Spec から、ファイルを気にせずに またはディレクトリを指定します。
上記以外の パス::タイニー モジュールは、ファイルの内容への簡単なアクセス、(ユニコード処理も可能)、そして一般的に必要とされるすべての "path"の操作を提供します。欠点:残念ながらCOREモジュールではないので、例えばCPANからインストールする必要があります。
EDIT
安全に使用できますか?
catfile
をディレクトリに使用することはできますか?私の場合
はい
(ただし、専門家の中にはもっと別のことをご存知の方もいらっしゃるかもしれません)。unixで。
-
は
catdir
が呼び出されます。canonpath
(論理的なパスのクリーニングを行う)。 -
その
catfile
はcanonpath
を2回、1回は ファイル の部分と ディレクトリ (提供されている場合)、2つの結果を連結します。連結の結果、奇妙な形のパスが生成されることがありますが、一般的には無害です。
Windowsでは、違いはさらに少なく、どちらもパスクリーニングルーチンを呼び出します。
デモ - 次のスクリプトは、異なるパーツの組み合わせを多数生成し、その中から
catdir
と
catfile
(の2つのバリエーションがあります(さらに
Path::Tiny
)
use strict;
use warnings;
use File::Spec::Functions;
use Path::Tiny;
my @parts = qw(x / /x /x/ /x// // //x //x/ //x// /./ /./x /x/./ );
my $cwidth=16;
print pr(qw(first second catdir catfile path-child path-list)), "\n";
print '-' x ($cwidth*6),"\n";
for my $first (map { s/x/first/r } @parts) {
for my $second ( map { s/x/second/r } @parts) {
print pr(
$first,
$second,
catdir($first,$second),
catfile($first,$second),
path($first)->child($second),
path($first,$second),
), "\n";
}
}
sub pr {
my $str;
$str .= sprintf "%-${cwidth}s",$_ for @_;
return $str;
}
長い結果が表示されます。以下に示すように、すべてのパスはディレクトリやファイルとして安全に使用できますが、一部のパスは
catfile
は、"nice"ではないですね。
両方の "Path::Tiny" の結果は、明確で一貫しています。逆に
catfile
と
catdir
を使うと、未定義の部分(デモでは表示されていません)を使用することができます - そして、このような間違った引数でも
は何らかの結果をもたらします。
の場合、Path::Tinyの
死ぬ
にundefまたはnull-stringを渡した場合、その
child
メソッドを使用します。
first second catdir catfile path-child path-list
------------------------------------------------------------------------------------------------
first second first/second first/second first/second first/second
first / first first// first first
first /second first/second first//second first/second first/second
first /second/ first/second first//second first/second first/second
first /second// first/second first//second first/second first/second
first // first first// first first
first //second first/second first//second first/second first/second
first //second/ first/second first//second first/second first/second
first //second// first/second first//second first/second first/second
first /./ first first// first first
first /./second first/second first//second first/second first/second
first /second/./ first/second first//second first/second first/second
/ second /second /second /second /second
/ / / // / /
/ /second /second //second /second /second
/ /second/ /second //second /second /second
/ /second// /second //second /second /second
/ // / // / /
/ //second /second //second /second /second
/ //second/ /second //second /second /second
/ //second// /second //second /second /second
/ /./ / // / /
/ /./second /second //second /second /second
/ /second/./ /second //second /second /second
/first second /first/second /first/second /first/second /first/second
/first / /first /first// /first /first
/first /second /first/second /first//second /first/second /first/second
/first /second/ /first/second /first//second /first/second /first/second
/first /second// /first/second /first//second /first/second /first/second
/first // /first /first// /first /first
/first //second /first/second /first//second /first/second /first/second
/first //second/ /first/second /first//second /first/second /first/second
/first //second// /first/second /first//second /first/second /first/second
/first /./ /first /first// /first /first
/first /./second /first/second /first//second /first/second /first/second
/first /second/./ /first/second /first//second /first/second /first/second
/first/ second /first/second /first/second /first/second /first/second
/first/ / /first /first// /first /first
/first/ /second /first/second /first//second /first/second /first/second
/first/ /second/ /first/second /first//second /first/second /first/second
/first/ /second// /first/second /first//second /first/second /first/second
/first/ // /first /first// /first /first
/first/ //second /first/second /first//second /first/second /first/second
/first/ //second/ /first/second /first//second /first/second /first/second
/first/ //second// /first/second /first//second /first/second /first/second
/first/ /./ /first /first// /first /first
/first/ /./second /first/second /first//second /first/second /first/second
/first/ /second/./ /first/second /first//second /first/second /first/second
/first// second /first/second /first/second /first/second /first/second
/first// / /first /first// /first /first
/first// /second /first/second /first//second /first/second /first/second
/first// /second/ /first/second /first//second /first/second /first/second
/first// /second// /first/second /first//second /first/second /first/second
/first// // /first /first// /first /first
/first// //second /first/second /first//second /first/second /first/second
/first// //second/ /first/second /first//second /first/second /first/second
/first// //second// /first/second /first//second /first/second /first/second
/first// /./ /first /first// /first /first
/first// /./second /first/second /first//second /first/second /first/second
/first// /second/./ /first/second /first//second /first/second /first/second
// second /second /second /second /second
// / / // / /
// /second /second //second /second /second
// /second/ /second //second /second /second
// /second// /second //second /second /second
// // / // / /
// //second /second //second /second /second
// //second/ /second //second /second /second
// //second// /second //second /second /second
// /./ / // / /
// /./second /second //second /second /second
// /second/./ /second //second /second /second
//first second /first/second /first/second /first/second /first/second
//first / /first /first// /first /first
//first /second /first/second /first//second /first/second /first/second
//first /second/ /first/second /first//second /first/second /first/second
//first /second// /first/second /first//second /first/second /first/second
//first // /first /first// /first /first
//first //second /first/second /first//second /first/second /first/second
//first //second/ /first/second /first//second /first/second /first/second
//first //second// /first/second /first//second /first/second /first/second
//first /./ /first /first// /first /first
//first /./second /first/second /first//second /first/second /first/second
//first /second/./ /first/second /first//second /first/second /first/second
//first/ second /first/second /first/second /first/second /first/second
//first/ / /first /first// /first /first
//first/ /second /first/second /first//second /first/second /first/second
//first/ /second/ /first/second /first//second /first/second /first/second
//first/ /second// /first/second /first//second /first/second /first/second
//first/ // /first /first// /first /first
//first/ //second /first/second /first//second /first/second /first/second
//first/ //second/ /first/second /first//second /first/second /first/second
//first/ //second// /first/second /first//second /first/second /first/second
//first/ /./ /first /first// /first /first
//first/ /./second /first/second /first//second /first/second /first/second
//first/ /second/./ /first/second /first//second /first/second /first/second
//first// second /first/second /first/second /first/second /first/second
//first// / /first /first// /first /first
//first// /second /first/second /first//second /first/second /first/second
//first// /second/ /first/second /first//second /first/second /first/second
//first// /second// /first/second /first//second /first/second /first/second
//first// // /first /first// /first /first
//first// //second /first/second /first//second /first/second /first/second
//first// //second/ /first/second /first//second /first/second /first/second
//first// //second// /first/second /first//second /first/second /first/second
//first// /./ /first /first// /first /first
//first// /./second /first/second /first//second /first/second /first/second
//first// /second/./ /first/second /first//second /first/second /first/second
/./ second /second /second /second /second
/./ / / // / /
/./ /second /second //second /second /second
/./ /second/ /second //second /second /second
/./ /second// /second //second /second /second
/./ // / // / /
/./ //second /second //second /second /second
/./ //second/ /second //second /second /second
/./ //second// /second //second /second /second
/./ /./ / // / /
/./ /./second /second //second /second /second
/./ /second/./ /second //second /second /second
/./first second /first/second /first/second /first/second /first/second
/./first / /first /first// /first /first
/./first /second /first/second /first//second /first/second /first/second
/./first /second/ /first/second /first//second /first/second /first/second
/./first /second// /first/second /first//second /first/second /first/second
/./first // /first /first// /first /first
/./first //second /first/second /first//second /first/second /first/second
/./first //second/ /first/second /first//second /first/second /first/second
/./first //second// /first/second /first//second /first/second /first/second
/./first /./ /first /first// /first /first
/./first /./second /first/second /first//second /first/second /first/second
/./first /second/./ /first/second /first//second /first/second /first/second
/first/./ second /first/second /first/second /first/second /first/second
/first/./ / /first /first// /first /first
/first/./ /second /first/second /first//second /first/second /first/second
/first/./ /second/ /first/second /first//second /first/second /first/second
/first/./ /second// /first/second /first//second /first/second /first/second
/first/./ // /first /first// /first /first
/first/./ //second /first/second /first//second /first/second /first/second
/first/./ //second/ /first/second /first//second /first/second /first/second
/first/./ //second// /first/second /first//second /first/second /first/second
/first/./ /./ /first /first// /first /first
/first/./ /./second /first/second /first//second /first/second /first/second
/first/./ /second/./ /first/second /first//second /first/second /first/second
関連
-
リリカルスコープ、ダイナミックスコープ、コールバック、クロージャを一挙紹介
-
Perl uc,lc,ucfirst,lcfirst 大文字・小文字変換関数群
-
Perlでは ->;, =>;, :: という記号はどういう意味ですか?
-
Perl学習ノート - CPANの使い方入門
-
Windows 10でのPerl環境のインストールと設定のための詳細チュートリアル
-
Perlでよく使われる記号と操作
-
perl スクリプティング スタディガイド - 読書メモ
-
Perl で QR コード用のプレーン HTML コードを生成する例
-
Perlの正規表現入門
-
[解決済み】Djangoプロジェクトの作業ディレクトリ構造に関するベストプラクティス【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Perl uc,lc,ucfirst,lcfirst 大文字・小文字変換関数群
-
Perl ビギナーズノート - Hello World
-
Perl List::Util モジュールの使用例
-
Windows の Thumbs.db から画像キャッシュのサムネイルを削除する Perl
-
Perl関数(サブルーチン)学習ノート
-
perlを使ってデータテーブル(mysql)を分割し、データインスタンスを移行する。
-
Tesseract-OCRを使用したPerl Captcha認識チュートリアル
-
Perlの正規表現入門
-
へのコメント Perl code for marriage proposal
-
File::Basename を使用してファイル拡張子を取得する Perl コード