2017-04-05 224 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; 
相关问题