[英]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",....
這樣的整個路徑"/home/PPP/main/windows/agile/cmPvt/aaa", "/home/PPP/main/windows/agile/cmPvt/bbb",....
另外,我試過foreach my $kknum (basename "@kkarray") { }
,但沒有用。
在執行glob()
時如何從完整路徑獲取“基本名稱”?
注意:由於某種原因,我無法在執行glob
命令之前對路徑執行chdir
。
您嘗試使用帶有插值數組的字符串作為basename
的參數。 那是錯的。 您應該采用單獨的路徑,而不是所有連接在一起的路徑。
for my $path (@paths) {
print "Basename is: ", basename($path);
}
它在文檔中說明了您應該如何使用basename
:
my $filename = basename($path);
my $filename = basename($path, @suffixes);
提供此 function 是為了與 Unix shell 命令 basename(1) 兼容。 它並不總是像您預期的那樣返回路徑的文件名部分。 為了安全起見,如果您想要路徑的文件名部分,請使用 fileparse()。
basename()
返回文件路徑的最后一層,即使最后一層顯然是目錄。 實際上,它就像路徑的pop()
一樣。 這不同於fileparse()
的行為。
# Both return "bar"
basename("/foo/bar");
basename("/foo/bar/");
您應該注意,通過從 glob 中刪除完整路徑,如果您不能也chdir
到它們的位置,您將無法訪問這些文件,就像您說的“出於某種原因”不能那樣做。 所以這整個練習對你來說可能毫無意義。
您可能想看看File::Find
,它遞歸地執行類似的操作,並自動允許您使用 select 基本名稱或全名。 就像一個一體機 package。
您可以使用map在數組的每個元素上調用basename
:
foreach my $kknum (map { basename($_) } @kkarray) {
}
如果需要,這會將完整路徑保留在數組變量中。
如果您不想在數組變量中使用完整路徑,則可以在填充數組時使用map
:
my @kkarray = map { basename($_) } glob("$kkLoc/*");
如果您只對該目錄中的文件名感興趣,那么直接讀取該目錄即可:
my $path = '.....';
opendir my $dir, $path or die "opendir($path): $!\n";
my @kkarray = sort grep !/^\.\.?$/, readdir $dir;
close $dir;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.