web-dev-qa-db-ja.com

Perlの文字列からファイル拡張子とパスを削除します

パス(文字列の一部である場合)および拡張子のないファイル名を取得したい。

例えば:

/path/to/file/fileName.txt     # results in "fileName"
fileName.txt                   # results in "fileName"
/path/to/file/file.with.periods.txt    # results in "file.with.periods" 

したがって、基本的には、前の「/」(存在する場合)と最後の「。」を含めて、前のものをすべて削除したいです。それ以降のメタ文字とともに。

このような初心者の質問には申し訳ありませんが、私はPerlを初めて使います。

29
Chris

フルパスを指定して移植可能なファイルのベース名を取得するには、 File::Basename モジュール。コアの一部です。

ファイル拡張子のヒューリスティックを行うには、次のような正規表現を使用します

(my $without_extension = $basename) =~ s/\.[^.]+$//;
38
rafl

他の人は答えましたが、raflの答えごとにベース名について少し読んだ後:

($file,$dir,$ext) = fileparse($fullname, qr/\.[^.]*/);
# dir="/usr/local/src/" file="Perl-5.6.1.tar" ext=".gz"

一行で問題を解決するようです。

他のソリューションとは対照的に、これに関連する問題はありますか?

18
Chris

パス区切り記号が'/'substitutions のペアでそれを行うことができます:

$name =~ s{^.*/}{};     # remove the leading path  
$name =~ s{\.[^.]+$}{}; # remove the extension

それを単一の置換として書くこともできます:

$name =~ s{^.*/|\.[^.]+$}{}g;
15
Eugene Yarmash