File::Basename - ファイルのベース名を取得
File::Basenameはファイル名からベース名やディレクトリ名を取得するためのモジュールです。次の3つの関数を使用することができます。
- basename - ファイルのベース名の取得
- dirname - ディレクトリ名の取得
- fileparse - もう少し細かな操作
これらの関数を使用するには関数を明示的にインポートするのがよいでしょう。
# 関数のインポート use File::Basename 'basename', 'dirname';
basename関数
ファイルのベース名を取得するにはbasename関数を使用します。ベース名というのはファイル名の中の末尾の部分です。
# ベース名の取得 $basename = basename $file;
dirname関数
ディレクトリ名を取得するにはdirname関数を使用します。
# ディレクトリ名の取得 $dirname = dirname $file;
basenameとdirnameのサンプルです。ファイル名が「dir/a.txt」の場合はbasenameで「a.txt」を、dirnameで「dir」を取得することができます。
# ベース名とディレクトリ名を取得 use File::Basename qw/basename dirname/; my $file = 'dir/a.txt'; my $basename = basename $file; my $dirname = dirname $file;
ファイル名に対するもう少し細かな操作
fileparseを使用するとベース名とディレクトリ名を一度に取得することができます。
# ベース名とディレクトリ名の取得 ($basename, $dirname) = fileparse $file;
またfileparseの第二引数に拡張子を正規表現で指定すると拡張子とベース名を分けて取り出すことができます。
# ベース名、ディレクトリ名、拡張子を取得 ($basename, $dirname, $ext) = fileparse($file, $regex);
拡張子を取り出すサンプルです。第二引数には正規表現を指定します。正規表現「\..*$」は「.がきて何でもよい文字が0個以上続いて終わる」という意味になります。$fileが「dir/a.txt」の場合は$basenameは「a」に、$extは「.txt」になります。
# 拡張子を取り出す use File::Basename 'fileparse'; my $file = 'dir/a.txt'; my ($basename, $dirname, $ext) = fileparse($file, qr/\..*$/);
上記は拡張子を取り出す例ですが、拡張子がふたつ続いた場合は先頭の拡張子以降が取り出されます。たとえばファイル名が「dir/a.txt.gz」であった場合は、$extは「.txt.gz」になります。
「.gz」を取り出したい場合は正規表現を「\.[^\.]*$」に変更します。この正規表現の意味は「.がきて.以外の文字が0個以上続いて終わる」という意味になります。