2017-04-05 219 views
0

我使用perl正則表達式來匹配最後一個斜槓後的所有內容。在閱讀perl文檔後,我意識到以下內容可以成爲代碼。perl提取最後一個斜槓後的字符串

use strict; 
use warnings; 
my $a = "E:/one/two/abc.dll"; 
if ($a =~ m/([^/]+$)/) 
{ 
print " the value is: $a \n"; 
} 

但我得到的最後一個字符串爲:abc.dll。可能是什麼問題 ?謝謝。

+2

您打開'使用嚴格的;使用警告;'。這樣做後,你真的嘗試運行代碼,或者你只是添加它來安撫堆棧溢出?因爲它會告訴你什麼是錯誤的,如果你編譯這段代碼:'不匹配[在正則表達式;標記爲< - HERE in m /([< - HERE^/' – Sobrique

回答

3

由於未轉義的/,您的代碼會給出語法錯誤。首先,您應該跳過\/或使用其他delimiters

然後在您的打印聲明中,您正在打印$a,因此您將獲得完整的數據。

您應該使用$&來打印匹配的圖案或$1以打印第一個分組元素。

在我的下面的代碼中,我使用了$1

use strict; 
use warnings; 
my $data = "E:/one/two/abc.dll"; 

if ($data =~ m/([^\/]+)$/) 
{ 
    print " the value is: $1 \n"; 
} 

然後請避免使用$a$b作爲變量名,這將不會給語法錯誤或警告。但這些都是保留的關鍵字排序。

+1

...並且不應該使用'$ a',因爲它在'perl'中有特殊含義,即使它沒有'單字母變量名是骯髒的,更重要的是 - '嚴格使用;使用警告'; OP包含在代碼中會阻止它編譯並且完全告訴它們什麼是問題。 – Sobrique

1

這是一個很好的工作split。下面的例子分割的是斜線字符行成一個列表,然後只需提取的最後一個條目(在這種情況下,abc.dll):

my $file = (split '/', $data)[-1]; 
0

你看起來像一個路徑的反思。如果這是真的,那麼最好使用一個旨在以便攜方式解析路徑的模塊。

以下所有示例均假定使用strictwarnings

File::Spec

use File::Spec; 
my ($volume, $dirs, $file) = File::Spec->splitpath('E:/one/two/abc.dll'); 

File::Basename

use File::Basename; 
my ($file, $dirs) = fileparse('E:/one/two/abc.dll'); 

Path::Tiny

use Path::Tiny; 
my $path = path('E:/one/two/abc.dll'); 
my $file = $path->basename; 
my $dirs = $path->parent->stringify; 
相關問題