2017-03-03 176 views
0

我正在寫一個perl腳本,它應該有一個數組數組。該數組查找當前目錄中的所有文件夾,然後數組的大小取決於文件夾。子數組包含所有包含的文件名。它可能有一個空文件夾,但我仍然想爲它創建一個數組。檢查數組中是否有一個數組是空的

my $root = "myCurrenDir"; 
@test = grep { -d "$root/$_" } read_dir($root); 
my @array = ? # how can be defined 

我們假設在當前目錄中有兩個文件夾。然後,父數組包含兩個數組作爲子元素。 (也許一個是空的)。

然後我想檢查(兩個)數組是否爲空,然後繼續下一步。

我使用Google搜索,但找不到明確的解決方案。我可以問你的幫忙嗎? (也許這很簡單,但我堅持!)。

+0

因此'@ test'現在僅包含目錄,並且您想要在'$ root'中查找所有文件並將它們放入'@ array'中? –

+0

正是我想要做的。 – Royeh

+0

嘗試'chdir $ root; @array = grep -f,<.* *>' –

回答

6

在標量上下文中評估數組將返回數組中的元素數量。我們可以使用它來實現檢查數組以查看它們是否包含任何數據的簡單邏輯。

if (@array) { 
    # @array contains data 
} else { 
    # @array contains no data 
} 

如果包含對其他數組的引用,那麼我們仍然可以使用同樣的邏輯陣列 - 我們只需要解引用我們的數組引用。

if (@{ $array[0] }) { 
    # $array[0] contains data 
} else { 
    # $array[0] contains no data 
} 

當然,我們可能要在一個循環中的所有子陣列的工作檢查@array;

for (@array) { 
    if (@$_) { 
    # child array contains data 
    } else { 
    # child array contains no data 
    } 
} 

這有幫助嗎?

此外,如果您正在步行目錄樹,那麼File::Find可能是一個更簡單的方法。

+0

非常感謝您的回答。這是我想要的! – Royeh

0

我認爲這可能爲您服務

use warnings; 
use strict; 

my @arr_repository; 
#declare working directory 
my $root = ".";  
opendir ROOT, $root or die "$root:$!"; 
#creating list of directories in working 
my @list_of_dirs=sort (grep (!/^(\.|\.\.)$/ && -d "$root/$_",readdir(ROOT)));  directory 
foreach my $dirName (@list_of_dirs) { 
     my @arr_ref_fileList; 
     #reading files in directory and inserting them in array_ref 
     my $arr_ref_fileList = read_directory($dirName); 
     #adding array with filenames into array  
     push @arr_repository, [@$arr_ref_fileList];  
     } 

sub read_directory { 
    my $input_dir = shift; 
    opendir IN,$input_dir or die "$input_dir:$!"; 
    my @list_of_files=sort (grep (!/^(\.|\.\.)$/ && -f "$input_dir/$_",readdir(IN))); # reading only files, avoiding "." and ".." 
    closedir(IN); 
    return \@list_of_files; 
    } 
  1. 你可能想使用數組的哈希值,而不是

    ,那麼你將能夠看到目錄中包含哪些文件。

    $hash_repository->{$dirName} = [@$arr_ref_fileList]; 
    
  2. 如果被檢查的目錄包含目錄本身,您可能希望使腳本遞歸。