我使用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。可能是什么问题 ?谢谢。
我使用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。可能是什么问题 ?谢谢。
由于未转义的/
,您的代码会给出语法错误。首先,您应该跳过\/
或使用其他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
作为变量名,这将不会给语法错误或警告。但这些都是保留的关键字排序。
...并且不应该使用'$ a',因为它在'perl'中有特殊含义,即使它没有'单字母变量名是肮脏的,更重要的是 - '严格使用;使用警告'; OP包含在代码中会阻止它编译并且完全告诉它们什么是问题。 – Sobrique
这是一个很好的工作split。下面的例子分割的是斜线字符行成一个列表,然后只需提取的最后一个条目(在这种情况下,abc.dll
):
my $file = (split '/', $data)[-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;
您打开'使用严格的;使用警告;'。这样做后,你真的尝试运行代码,或者你只是添加它来安抚堆栈溢出?因为它会告诉你什么是错误的,如果你编译这段代码:'不匹配[在正则表达式;标记为< - HERE in m /([< - HERE^/' – Sobrique