目錄路徑“/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()?
注意:由于某種原因,我無法chdir在執行命令之前對路徑進行操作。glob
uj5u.com熱心網友回復:
您嘗試使用帶有插值陣列的字串作為basename. 那是錯的。您應該采用單獨的路徑,而不是將所有路徑連接在一起。
for my $path (@paths) {
print "Basename is: ", basename($path);
}
它在檔案中說明了您應該如何使用該basename功能:
my $filename = basename($path);
my $filename = basename($path, @suffixes);
提供此函式是為了與 Unix shell 命令 basename(1) 兼容。它并不總是像您期望的那樣回傳路徑的檔案名部分。為了安全起見,如果您想要路徑的檔案名部分,請使用 fileparse()。
basename()即使最后一級顯然是目錄,也回傳檔案路徑的最后一級。實際上,它的作用類似于pop()路徑。這與fileparse()的行為不同。
# Both return "bar"
basename("/foo/bar");
basename("/foo/bar/");
您應該注意,通過從 glob 中洗掉完整路徑,如果您也無法訪問檔案chdir的位置,您將無法訪問這些檔案,就像您說您不能“出于某種原因”那樣做。所以這整個練習對你來說可能毫無意義。
您可能想看看File::Find哪個遞回地執行類似的操作,并自動允許您選擇基本名稱或全名。就像一個多合一的包裝。
uj5u.com熱心網友回復:
您可以使用map呼叫basename陣列的每個元素:
foreach my $kknum (map { basename($_) } @kkarray) {
}
如果需要,這會將完整路徑保留在陣列變數中。
如果您從不想要陣列變數中的完整路徑,則可以map在填充陣列時使用:
my @kkarray = map { basename($_) } glob("$kkLoc/*");
uj5u.com熱心網友回復:
如果您只對該目錄中的檔案名感興趣,那么只需直接閱讀該目錄:
my $path = '.....';
opendir my $dir, $path or die "opendir($path): $!\n";
my @kkarray = sort grep !/^\.\.?$/, readdir $dir;
close $dir;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450439.html
上一篇:如何從Moose包中匯出子程式?
