ファイルパスの解析
■この章で解説するモジュール
File::Basename (basename, dirname, fileparse, fileparse_set_fstype)
■この章でできること
・ファイルパスを分解する
・ファイルパスからディレクトリ名を取得する
・ファイルパスからファイル名を取得する
・ファイルパスから拡張子を取得する

 ファイルパスを分解してディレクトリ部分やファイル名、拡張子だけを取り出したいことはよくあります。自力でコードを書いてもいいですが、これらはFile::Basenameモジュールを使うと簡単にできます。

 では、まずはFile::Basenameモジュールのサンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# ファイルパスの解析のサンプル
# Author: "Perl Programming Tips"
#############################################

use File::Basename;

$filepath = "/home/g/pl/file/file_07_01.pl";
@extlist = ('.pl');
print "filepath: $filepath\n\n";

# ファイルシステムの設定(デフォルト:Unix)
fileparse_set_fstype('Unix');

# ファイルのベース名を取得
$bn = basename($filepath);
print "basename: $bn\n";
$bn = basename($filepath, @extlist);
print "basename: $bn\n\n";

# ディレクトリ名部分を取得
$dir = dirname($filepath);
print "dir name: $dir\n\n";

# ファイル名、パス、サフィックスを取得
($fn, $path, $ext) = fileparse($filepath);
print "filename: $fn\n";
print "path    : $path\n";
print "suffix  : $ext\n\n";

($fn, $path, $ext) = fileparse($filepath, @extlist);
print "filename: $fn\n";
print "path    : $path\n";
print "suffix  : $ext\n";

 実行結果は次のようになります。

[g@630m file]$ perl file07_01.pl 
filepath: /home/g/pl/file/file_07_01.pl

basename: file_07_01.pl
basename: file_07_01

dir name: /home/g/pl/file

filename: file_07_01.pl
path    : /home/g/pl/file/
suffix  : 

filename: file_07_01
path    : /home/g/pl/file/
suffix  : .pl
[g@630m file]$ 

 最初にuse File::Basename;でFile::Basenameモジュールをインポートしておきます。使用前にfileparse_set_fstype関数で、使用しているOSをFile::Basenameモジュールに伝えておきます。ただし、デフォルトはUNIXなので、使用しているOSがUNIXの場合は特に実行する必要はありません。

File::Basename::fileparse_set_fstype
File::BasenameにOSの種別を設定する。
書式
fileparse_set_fstype os-string
引数
os-string:
OS種別(Unix、VMS、MacOS、AmigaOS、MSDOS、MSWin32、DOS、Epoc、OS2、RISCOSのいずれか)
戻り値
直前に選択されていたOS種別

 次に、ファイルパスからファイル名のみを取り出す場合はbasename関数を使います。拡張子リストを渡した場合は、渡したリスト中の拡張子を含まないファイル名が返ります。上のサンプルプログラムの実行結果を見ると、拡張子リストを省略した場合と渡した場合での動作の違いがわかります。

File::Basename::basename
fullnameで渡されるファイルパスからファイル名を取り出す。UNIXのbasenameコマンドとの互換性のために用意されている。
書式
basename fullname, [suffixlist]
引数
fullname:
ファイルパス
suffixlist:
サフィックス(拡張子)を見つけるためにパターンマッチに使用されるパターンのリスト。省略可能。
戻り値
ファイル名

 ディレクトリ部分だけを取り出す場合は、dirname関数を使います。

File::Basename::dirname
fullnameで渡されるファイルパスからディレクトリ部分を取り出す。
書式
dirname fullname
引数
fullname:
ファイルパス
戻り値
ディレクトリ名

 ファイルパスを、ディレクトリ部分、ファイル名、拡張子に分解したい場合は、fileparse関数を使います。

File::Basename::fileparse
fullnameで渡されるファイルパスをディレクトリ部分、ファイル名、拡張子に分解する。
書式
fileparse, fullname, [suffixlist]
引数
fullname:
ファイルパス
suffixlist:
サフィックス(拡張子)を見つけるためにパターンマッチに使用されるパターンのリスト。省略可能。
戻り値
ファイル名、パス、サフィックスの順にリストを返す。

 拡張子リストを省略した場合は、ファイル名に拡張子が含まれます。上のサンプルプログラムの実行結果を見ると、basename関数と同様に拡張子リストを渡した場合と省略した場合での動作の違いがわかります。