在perl中的最后一个斜杠后提取字符串

时间:2017-04-05 05:51:45

标签: perl

我使用perl正则表达式匹配最后一个斜杠后的所有内容。在阅读了perl doc之后,我意识到以下可以是代码。

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

但我得到的最后一个字符串为:abc.dll。可能是什么问题 ?感谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

split这是一个很好的工作。下面的示例将斜杠字符上的行拆分为列表,然后只提取最后一个条目(在本例中为abc.dll):

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

答案 2 :(得分:1)

你拥有的东西看起来像一条路。如果这是真的,那么最好使用一个旨在以便携方式解析路径的模块。

以下所有示例均假设使用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;