我是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个输出。请指导。
由于路径以定界符/本身开头,因此首先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)
同样,可以像其他示例一样单独使用最后一个元素。