2011-01-22 23 views

答えて

24

なぜホイールを改造するのですか?

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/.*\///; 

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

  1. それは間違っています。 Unixベースのシステム(Windowsについてはわからない)のファイル名に改行を含めることができます。しかし、デフォルトでは.は改行と一致しません。

    ($file = $path) =~s/.*\///s; 
    
  2. が最も重要なことは、ポータブルではありませんいくつかのプラットフォームのような場合ではありません、パスの区切りであることが/を想定しているよう:.が同様に改行と一致するようにだからあなたはs修飾子を使用する必要がありますWindows(\を使用)、Mac(:を使用)したがって、モジュールを使用して、これらの問題をすべて処理してください。

+1

が合意しています

use File::Basename; my $file_name = basename($0); 

。通常、このようなモジュールは、クロスプラットフォームなので、正規表現よりも優れています。 – justintime

+1

また、File :: Basenameはコアモジュールであり、常にPerl 5に組み込まれているため、インストールする必要はありません。 – mscha

+0

File :: Basenameのマニュアルページでは、 "[basename]が期待通りにファイル名部分を返すわけではないので、このタスクに' fileparse'メソッドを使うことをお勧めします。 – jutky

3
use File::Basename 

それがどのように動作するかについて詳細な説明については下のリンクをチェックしてください:

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

0

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, $/; 
0
$url=~/\/([^\/]+)$/; 
print "Filename $1\n"; 
+2

より良い投稿をするためには、なぜ特定の正規表現がさまざまな例のために動作するのかを説明して答えを広げることができます。これはあなたの答えがオリジナルのポスター、そして他の多くの将来の読者にとって意味をなさせるのに役立ちます。 – Castaglia

1

私はこれを行うための最善の方法だと思います - だから、変数$file_nameは、スクリプトの名前

関連する問題