从 '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;
目录路径“/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 likepop()
for paths. This differs fromfileparse()
'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;