2012-08-30 46 views
3

有效的方法獲取最頂端的路徑元素在Perl

my $path = "//strange/path/"; 

需要獲得與第1個要素(一個)斜線= /strange或只有/是$路徑爲空或只包含斜槓。

目前有兩種解決方案,例如:

use 5.014; 
use warnings; 
use File::Spec; 
my $path = "//strange/path/"; 

#version with File::Spec 
my $v1 = "/" . ([grep {/./} File::Spec->splitdir($path)]->[0] // ""); 
say $v1; 

#regex 
my $v2 = $path; 
$v2 =~ s{^/*}{}; 
$v2 =~ s{/.*}{}; 
$v2 =~ s{^}{/}; 
say $v2; 

我不喜歡任何人,因爲1.st使用模塊,並在第二個3點的正則表達式僅僅是難看。

存在更有效||最快|| 「更好」的方法?

+7

就我個人而言,我喜歡使用模塊的方式,尤其是像'File :: Spec'這樣的標準模塊。您可以合理地確信代碼已經過數千用戶的測試並證明是有效的(與您自己的自制正則表達式不同),並且'File :: Spec'提供了自動跨平臺功能。 –

回答

2

如果你想正則表達式,你可以試試下面的「正則表達式的一個」解決方案:

use 5.014; 
use warnings; 
while(<DATA>) { 
    chomp; 
    my $o = my $n = $_; 
    $n =~ s:(^/*)([^/]*)?(/*.*):/$2:; 
    say "=$o= =$n="; 
} 
__DATA__ 

/
// 
strange 
strange/ 
strange/path 
/strange 
/strange/ 
/strange/path 
//strange 
//strange/ 
//strange/path 
//strange// 
//strange// 
//strange//path 

但正如上面@Moritz Bunkus說 - 最好是使用標準的文件::規格。

+0

好的,將使用File :: Spec。 ;)接受這隻作爲答案。 – cajwine

相關問題