ファイル名や拡張子を取得する(File::Basename) - Perl

次のようなファイルパスから、ファイル名や拡張子を取り出したいが、どのようにすれば良いだろうか?

$file_unix = q|/home/hoge/image.jpg|;
$file_win = q|\home\hoge\image.jpg|;
$file_mac = q|::home:hoge:image.jpg|;

File::Basenameモジュールを使用すると、OSによって異なるディレクトリ(フォルダ)とファイルの区切り文字を意識しなくても良い。

サンプル

;#
;#ファイル名、拡張子の取り出し
;#

use File::Basename;

#-----------------------------------#
#            パスの用意             #
#-----------------------------------#
$file_unix = q|/home/hoge/image.jpg|;
$file_win  = q|\home\hoge\image.jpg|;
$file_mac  = q|::home:hoge:image.jpg|;

#-----------------------------------#
#             取り出し              #
#-----------------------------------#
#-- UNIX --#
print getFileName($file_unix), "\n";    #ファイル名
print getSuffix($file_unix),   "\n";    #拡張子
print "\n";

#-- Windows --#
print getFileName($file_win), "\n";     #ファイル名
print getSuffix($file_win),   "\n";     #拡張子
print "\n";

#-- Mac --#
print getFileName($file_mac), "\n";     #ファイル名
print getSuffix($file_mac),   "\n";     #拡張子
print "\n";


#------------------------------------------------
#ファイル名を取り出す
#------------------------------------------------
sub getFileName{
    my $path = shift;
    my ($name, $path, $suffix) = fileparse($path, ());

    return ( $name );
}


#------------------------------------------------
#拡張子を取り出す
#------------------------------------------------
sub getSuffix{
    my $path       = shift;
    my @suffixlist = @_;
    my ($name, $path, $suffix) = fileparse($path, @suffixlist);

    #-- 指定した拡張子が含まれれば返す --#
    if( scalar(@suffixlist) ){
        return($suffix);
    }
    #-- 拡張子をそのまま返す --#
    else{
        my $suffix = '';

        #'.' が 1つ以上あるか
        if( index($name, '.',  0) != -1){
            $suffix = (split(/\./, $name))[-1];  #拡張子取出し
        }

        return($suffix);
    }
}

実行例

image.jpg
jpg

image.jpg
jpg

image.jpg
jpg

getSuffix関数は拡張子を取り出すだけではなく、指定した拡張子が含まれているかどうかをチェックすることが可能である。下記のようにファイルパスの後に続けて書けば良い。指定した拡張子が含まれていれば、その拡張子を返してくれる。

getFileName($file_win, '.jpg', '.gif', '.png');

なお、拡張子指定の場合に限らず、拡張子が含まれていないファイル名の場合は、何も返らない(空文字列ないしundef)