基于正斜杠的Perl拆分字符串

Ume*_*cha 1 regex perl

我是Perl的新手,所以这是基本问题。我有一个字符串,如下所示。我有兴趣从中取出日期,所以想用斜线分割

my $path = "/bla/bla/bla/20160306";
my $date = (split(/\//,$path))[3];#ideally 3 is date position in array after split
print $date;
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到预期的输出,但是看到了5个输出。请指导。

zdi*_*dim 5

由于路径以定界符/本身开头,因此首先split返回一个带有空字符串的列表(在第一个字符串的左侧/);一个元素。因此,发布的代码将错误计数一位,并返回路径中最后一个元素(子目录)之前的一个,而不是日期。

如果日期始终是字符串中的最后一件事,则可以选择最后一个元素

my $date = (split '/', $path)[-1];
Run Code Online (Sandbox Code Playgroud)

我曾经用过''定界符,所以不必逃脱/。(但是,这可能会造成混淆,因为分隔符模式是一个正则表达式,//传达了它,而它''似乎只是引用了一个字符串。)


这也可以用正则表达式来完成

my @parts = $path =~ m{([^/]+)}g;
Run Code Online (Sandbox Code Playgroud)

或者,可以使用,从上面的完整列表中选择最后一部分($path =~ m{...}g)[-1],但是如果您确实只需要最后一点,那么最好直接提取它

my $last_part = $path =~ m{.*/(.*)};
Run Code Online (Sandbox Code Playgroud)

在这里,“贪心” .*将字符串中的所有内容匹配到下一个子模式的最后一个实例(/此处),从而使我们到达路径的最后一部分,然后将其捕获。


是什么使我们认识到您正在解析路径,并且有专用于此的库。

要将路径拆分成多个组件,一种工具splitdir来自File :: Spec

use File::Spec;

my @parts = File::Spec->splitdir($path);
Run Code Online (Sandbox Code Playgroud)

如果路径以a开头,/我们将再次为第一个元素获得一个空字符串(根据设计,请参阅docs)。如果存在,可以将其删除

shift @parts if $parts[0] eq '';
Run Code Online (Sandbox Code Playgroud)

同样,可以像其他示例一样单独使用最后一个元素。