我在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下运行。