2011-01-22 86 views

回答

24

爲什麼要重新發明輪子?使用File::Basename模塊:

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

爲什麼$file=$path=~s/.*\///;不行?

=~具有較高precedence=

所以

$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(使用:)。因此,請使用該模塊並讓它爲您處理所有這些問題。

+1

協議的名稱。通常更好地使用像這樣的模塊而不是正則表達式,因爲它是跨平臺的。 – justintime 2011-01-22 11:34:08

+1

還要注意File :: Basename是一個核心模塊,並且一直在Perl 5中,因此不需要安裝它。 – mscha 2011-01-22 12:45:15

0

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

我想這樣做的最好的辦法是 -

use File::Basename; 

my $file_name = basename($0); 

所以變量$file_name將有你的腳本

相關問題