我有一个Perl变量从数据库中填充。它的名字是$path
。我需要得到另一个变量$file
,它只有路径名中的文件名。如何从使用Perl的路径中提取文件名?
我想:
$file = $path =~ s/.*\///;
我很新的Perl的。
我有一个Perl变量从数据库中填充。它的名字是$path
。我需要得到另一个变量$file
,它只有路径名中的文件名。如何从使用Perl的路径中提取文件名?
我想:
$file = $path =~ s/.*\///;
我很新的Perl的。
为什么要重新发明轮子?使用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
更换。
但同样也有很多问题,这个解决方案:
这是不正确。基于Unix的系统中的文件名(不确定Windows)可以包含换行符。但.
默认情况下不匹配换行符。所以,你必须使用一个s
修改,使.
匹配换行符以及:
($file = $path) =~s/.*\///s;
最重要的是它是不可移植的,因为它是假设/
是路径分隔符这是不符合某些平台等的情况下Windows(使用\
),Mac(使用:
)。因此,请使用该模块并让它为您处理所有这些问题。
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, $/;
$url=~/\/([^\/]+)$/;
print "Filename $1\n";
我想这样做的最好的办法是 -
use File::Basename;
my $file_name = basename($0);
所以变量$file_name
将有你的脚本
协议的名称。通常更好地使用像这样的模块而不是正则表达式,因为它是跨平台的。 – justintime 2011-01-22 11:34:08
还要注意File :: Basename是一个核心模块,并且一直在Perl 5中,因此不需要安装它。 – mscha 2011-01-22 12:45:15