Perlでパスからファイル名を取得する方法

Perlでパスからファイル名を取得する方法

Posted at January 21,2013 12:33 AM
Tag:[Perl]

Perlでパスからファイル名(ベース名)を取得する方法を紹介します。

1.サンプル

Windowsのパスの場合、

C:\Documents and Settings\foo\bar\hoge.txt

というパスから「hoge.txt」を抜き出します。また、Linuxの場合、

/var/html/foo/bar/hoge.txt

というパスから、「hoge.txt」を抜き出します。

2.File::Basenameを使って取得する

一番簡単な方法は、File::Basenameの利用です。File::Basenameはファイル名やディレクトリ名を取得するためのモジュールです。

次のようにbasename()を利用し、パラメータにパスを渡すことで、ファイル名が返却値で取得できます。

use strict;
use File::Basename;
 
my $file_path1 = 'C:\Documents and Settings\foo\bar\hoge.txt';
my $file_path2 = '/var/html/foo/bar/hoge.txt';
 
my $file_name1 = basename($file_path1);
my $file_name2 = basename($file_path2);

あるいはfileparse()を利用します。fileparse()はファイル名、ディレクトリ、拡張子などを分析して取得するための関数です。

ここではファイル名とディレクトリを取得するサンプルを示します。

use strict;
use File::Basename;
 
my $file_path1 = 'C:\Documents and Settings\foo\bar\hoge.txt';
my $file_path2 = '/var/html/foo/bar/hoge.txt';
 
my ($file_name1, $dir_name1) = fileparse($file_path1);
my ($file_name2, $dir_name2) = fileparse($file_path2);

File::BasenameはOSに依存しないように作られています。WindowsとLinux(Mac)ではファイルの区切り文字がそれぞれ異なりますが、いずれも正常に動作します。

3.正規表現を使って取得する

正規表現を使ってパスからファイル名を取得するには、次のようにします。

use strict;
  
my $file_path1 = 'C:\Documents and Settings\foo\bar\hoge.txt';
my $file_path2 = '/var/html/foo/bar/hoge.txt';
 
(my $file_name1 = $file_path1) =~ s!.*/|.*\\(.*)$!$1!;
(my $file_name2 = $file_path2) =~ s!.*/|.*\\(.*)$!$1!;

余談ですが、演算子はスラッシュを使った、

s///

が一般的ですが、上記のサンプルのように他の文字(ここでは「!」)で代用すれば、正規表現に含まれるスラッシュをエスケープする必要がなくなります。

関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)