web-dev-qa-db-ja.com

Perlを使用してパスからファイル名を抽出するにはどうすればよいですか?

データベースから入力したPerl変数があります。その名前は $path。別の変数を取得する必要があります$fileパス名からのファイル名だけが含まれます。

私は試した:

$file = $path =~ s/.*\///;

私はPerlにとても慣れていません。

16
JUAN

なぜ車輪の再発明をするのですか? File :: Basename モジュールを使用します:

use File::Basename;
...
$file = basename($path);

$file=$path=~s/.*\///;が機能しなかったのはなぜですか?

=~=よりも 優先順位 高い

そう

$file = $path =~s/.*\///;

として扱われます:

$file = ($path =~s/.*\///);

これは、$pathで置換を行い、1(置換が発生した場合)または''(置換が発生しなかった場合)のいずれかを割り当てます。

あなたが欲しいものは:

($file = $path) =~s/.*\///;

これは、$pathの値を$fileに割り当ててから、$pathで置換を行います。

しかし、このソリューションには多くの問題があります。

  1. 正しくありません。 Unixベースのシステム(Windowsについては不明)のファイル名には、改行を含めることができます。ただし、デフォルトでは.は改行と一致しません。したがって、.が改行にも一致するように、s修飾子を使用する必要があります。

    ($file = $path) =~s/.*\///s;
    
  2. 最も重要なのは、/がパス区切り文字であると想定しているため、移植性がないことです。これは、Windows(\を使用)、Mac(:を使用)などの一部のプラットフォームには当てはまりません。したがって、モジュールを使用して、これらすべての問題を処理できるようにしてください。

32
codaddict
use File::Basename 

仕組みの詳細については、以下のリンクを確認してください。

http://p3rl.org/File::Basename

3
lukuluku

これを行う最良の方法は-

use File::Basename;

my $file_name = basename($0);

したがって、変数$file_nameスクリプトの名前が付けられます

2
Abhi

Path :: Class 最初はやり過ぎのように見えるかもしれません—ファイルとディレクトリパスのオブジェクトを作成します—しかし、それは複雑なスクリプトで実際に報われることができ、あなたが戻ったときにスパゲッティを防ぐたくさんのボーナスを提供しますスコープクリープによるコーナー。 File :: Spec は、パスを解決するための楽しみのために最初の例で使用されています。

use warnings;
use strict;
use Path::Class qw( file );
use File::Spec;

# Get the name of the current script with the procedural interface-
my $self_file = file( File::Spec->rel2abs(__FILE__) );
print
    " Full path: $self_file", $/,
    "Parent dir: ", $self_file->parent, $/,
    " Just name: ", $self_file->basename, $/;

# OO                                    
my $other = Path::Class::File->new("/tmp/some.weird/path-.unk#");
print "Other file: ", $other->basename, $/;
1
Ashley
$url=~/\/([^\/]+)$/;
print "Filename $1\n";
1
Anatoly