Perl开发:不切换目录时如何通过glob获取文件路径的basename
解决Perl中glob获取路径basename的问题
嘿,我懂你碰到的麻烦了——用glob拿到的全是完整路径,想直接存basename但之前的写法没生效对吧?其实问题出在你把整个数组传给basename的方式上,咱们来一步步解决,而且完全不用切换工作目录。
最简洁的写法:用map批量处理glob结果
map可以帮我们逐个处理glob返回的每个完整路径,把它们转成basename后再存入数组。直接改写你的代码就行:
use File::Basename; my $kkLoc = "/home/PPP/main/windows/agile/cmPvt"; # 用map遍历每个glob返回的路径,转成basename my @kkarray = map { basename($_) } glob("$kkLoc/*") if (-e $kkLoc);
为什么你之前的写法失败了?
你试过foreach my $kknum (basename "@kkarray"),这其实是把整个数组拼接成一个空格分隔的字符串传给basename——比如数组里的"/home/xxx/aaa"和"/home/xxx/bbb"会变成"/home/xxx/aaa /home/xxx/bbb",basename只会把这个当成单个路径字符串处理,自然得不到想要的结果。咱们需要的是逐个处理每个路径元素,map正好能做到这一点。
另一种写法:在循环里逐个转换
如果你更喜欢分步处理,也可以在foreach循环里把每个完整路径转成basename后再push到数组:
use File::Basename; my $kkLoc = "/home/PPP/main/windows/agile/cmPvt"; my @kkarray; if (-e $kkLoc) { foreach my $full_path (glob("$kkLoc/*")) { push @kkarray, basename($full_path); } }
这两种方法都不用切换工作目录,处理完的@kkarray里就直接是"aaa"、"bbb"这类basename了。而且File::Basename是Perl的核心模块,不用额外安装,直接用就好~
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

