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///
が一般的ですが、上記のサンプルのように他の文字(ここでは「!」)で代用すれば、正規表現に含まれるスラッシュをエスケープする必要がなくなります。
Posted by yujiro このページの先頭に戻る
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて
トラックバックURL
コメントする
greeting