我使用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。可能是什么问题 ?感谢。
答案 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)
你拥有的东西看起来像一条路。如果这是真的,那么最好使用一个旨在以便携方式解析路径的模块。
以下所有示例均假设使用strict
和warnings
。
use File::Spec;
my ($volume, $dirs, $file) = File::Spec->splitpath('E:/one/two/abc.dll');
use File::Basename;
my ($file, $dirs) = fileparse('E:/one/two/abc.dll');
use Path::Tiny;
my $path = path('E:/one/two/abc.dll');
my $file = $path->basename;
my $dirs = $path->parent->stringify;