2011-01-22 190 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将有你的脚本

相关问题