我有一個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