从 'glob' 获得 'basename'

Get 'basename' from 'glob'

目录路径“/home/PPP/main/windows/agile/cmPvt”的内容为 aaa、bbb、ccc、ddd。

代码片段:

use File::Basename;
my $kkLoc = ("/home/PPP/main/windows/agile/cmPvt");
my @kkarray = glob("$kkLoc/*") if (-e $kkLoc);
foreach my $kknum (@kkarray) {  ## Here: see below
}   

这里:我希望 @kkarray 中的那个,"aaa", "bbb", "ccc", "ddd" 应该来,但是我得到的整个路径像 "/home/PPP/main/windows/agile/cmPvt/aaa", "/home/PPP/main/windows/agile/cmPvt/bbb",.... 另外,我试过了,foreach my $kknum (basename "@kkarray") { },但不工作。

如何在执行 glob() 时从完整路径获取“基本名称”?

注意:由于某种原因,我无法在执行glob命令之前对路径执行chdir

您可以使用 map 对数组的每个元素调用 basename

foreach my $kknum (map { basename($_) } @kkarray) {
}

如果需要,这会将完整路径保留在数组变量中。

如果您不想在数组变量中使用完整路径,则可以在填充数组时使用 map

my @kkarray = map { basename($_) } glob("$kkLoc/*");

您试图使用带有内插数组的字符串作为 basename 的参数。那是错的。您应该采用单独的路径,而不是所有连接在一起的路径。

for my $path (@paths) { 
    print "Basename is: ", basename($path);
}

它在 documentation 中说明了您应该如何使用 basename 函数:

my $filename = basename($path);
my $filename = basename($path, @suffixes);

This function is provided for compatibility with the Unix shell command basename(1). It does NOT always return the file name portion of a path as you might expect. To be safe, if you want the file name portion of a path use fileparse().

basename() returns the last level of a filepath even if the last level is clearly directory. In effect, it is acting like pop() for paths. This differs from fileparse()'s behaviour.

# Both return "bar"
basename("/foo/bar");
basename("/foo/bar/");

您应该注意,通过从 glob 中删除完整路径,如果您也不能 chdir 到它们的位置,您将无法访问这些文件,就像您说的“出于某种原因”不能那样做。所以这整个练习对你来说可能毫无意义。

您可能想看看 File::Find 做类似的事情,递归地,并自动允许您 select 基本名称或全名。就像一个多合一的包裹。

如果您只对目录中的文件名感兴趣,那么直接阅读目录即可:

my $path = '.....';
opendir my $dir, $path or die "opendir($path): $!\n";
my @kkarray = sort grep !/^\.\.?$/, readdir $dir;
close $dir;