如何在Perl中提取列表的最后一个元素



我在Perl中的一个变量中有以下内容。

my $test = *             file/test/ttt/rrr/aaa/abc.fff.ter.yyy:myfilename.txt

我想提取

myfilename.txt

带有/的初始路径将更改(可能有许多目录没有固定(,我只想要最后一个文件名。

我该怎么做?

我尝试使用:

$filename= (split ///, $test)[4] ;

最好的解决方案可能是使用专门为这件事设计的模块。

use File::Basename;
my $filename = basename($test);

其他解决方案可能基于正则表达式:

如果你想提取字符串中冒号后面的部分,比如这个字符串,你可以这样做:

my ($filename) = $test =~ /:(.+)/;

或者,如果你想在的末尾提取一个basename+扩展名

my ($filename) = $test =~ /(w+.w+)$/;

或基于split的解决方案

my $filename = (split /:/, $test)[-1];

您可以从具有负索引的列表末尾向后计数。列表的最后一个元素是-1,倒数第二个是-2,依此类推:

$filename= (split ///, $test)[-1];

如果您的列表在一个数组中,则$#array_name是最后一个元素的索引。这比仅仅使用-1有点笨拙:

my @array = qw( 1 3 7 );
my $last = $array[$#array];

如果你不关心数组,你可以用pop移除最后一个元素,它会返回这个值:

my $last = pop @array

添加了上述答案中的一个方法:

$fullpath = $ARGV[0];
my ($filename) = $fullpath=~m/(?:\|/)(?:[^:]+):([^/\]+)$/;
print $filename;

上面的代码应该可以在Windows或Linux下运行。

最新更新