簡體   English   中英

從 '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",....這樣的整個路徑"/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM