私はデータベースから移入するPerl変数を持っています。その名前は$path
です。パス名からファイル名だけを持つ別の変数$file
を取得する必要があります。Perlを使用してパスからファイル名を抽出するにはどうすればよいですか?
私が試した:
$file = $path =~ s/.*\///;
私はPerlのに非常に新しいです。
私はデータベースから移入するPerl変数を持っています。その名前は$path
です。パス名からファイル名だけを持つ別の変数$file
を取得する必要があります。Perlを使用してパスからファイル名を抽出するにはどうすればよいですか?
私が試した:
$file = $path =~ s/.*\///;
私はPerlのに非常に新しいです。
なぜホイールを改造するのですか?
use File::Basename;
...
$file = basename($path);
なぜ$file=$path=~s/.*\///;
は動作しませんでした:File::Basenameモジュールを使用しますか? $path
で置換を行い、割り当て
$file = ($path =~s/.*\///);
いずれか1
(交換が発生した場合)、または''
:
=~
そこで
$file = $path =~s/.*\///;
として扱われる高い
precedenceより
=
を有します(置換が発生しない場合)。
何がしたいことは次のとおりです。
$file
から
$path
の値を代入して、
$path
で交換を行い
($file = $path) =~s/.*\///;
。
しかし、再び、このソリューションには多くの問題があります
それは間違っています。 Unixベースのシステム(Windowsについてはわからない)のファイル名に改行を含めることができます。しかし、デフォルトでは.
は改行と一致しません。
($file = $path) =~s/.*\///s;
が最も重要なことは、ポータブルではありませんいくつかのプラットフォームのような場合ではありません、パスの区切りであることが/
を想定しているよう:.
が同様に改行と一致するようにだからあなたはs
修飾子を使用する必要がありますWindows(\
を使用)、Mac(:
を使用)したがって、モジュールを使用して、これらの問題をすべて処理してください。
Path::Classは、ファイルの最初の作りのオブジェクトとdirでやり過ぎのように見えるかもしれませんパス、それ複雑なスクリプトで本当に報酬を得ることができ、スコープクリープによってコーナーに戻ったときにスパゲッティを防ぐボーナスをたくさん提供します。 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, $/;
$url=~/\/([^\/]+)$/;
print "Filename $1\n";
より良い投稿をするためには、なぜ特定の正規表現がさまざまな例のために動作するのかを説明して答えを広げることができます。これはあなたの答えがオリジナルのポスター、そして他の多くの将来の読者にとって意味をなさせるのに役立ちます。 – Castaglia
私はこれを行うための最善の方法だと思います - だから、変数$file_name
は、スクリプトの名前
が合意しています
。通常、このようなモジュールは、クロスプラットフォームなので、正規表現よりも優れています。 – justintime
また、File :: Basenameはコアモジュールであり、常にPerl 5に組み込まれているため、インストールする必要はありません。 – mscha
File :: Basenameのマニュアルページでは、 "[basename]が期待通りにファイル名部分を返すわけではないので、このタスクに' fileparse'メソッドを使うことをお勧めします。 – jutky