我正在编写一个perl脚本,应该有一个数组数组。此数组查找当前目录中的所有文件夹,然后数组的大小取决于文件夹。 children数组包含所有包含的文件名。我可能有一个空文件夹,但我仍然想为它创建一个数组。
my $root = "myCurrenDir";
@test = grep { -d "$root/$_" } read_dir($root);
my @array = ? # how can be defined
我们假设在当前目录中有两个文件夹。然后父数组包含两个数组作为子数。 (也许一个是空的)。
然后我想检查(两个)数组是否为空并继续执行下一步。
我用谷歌搜索但无法找到明确的解决方案。我可以请你帮忙吗? (也许这很简单,但我坚持下去!)。
答案 0 :(得分:7)
在标量上下文中计算数组将返回数组中的元素数。我们可以使用它来实现检查数组以查看它们是否包含任何数据的简单逻辑。
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可能是一种更简单的方法。
答案 1 :(得分: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;
}
您可能希望使用数组的哈希值,然后您将能够看到哪个目录包含哪些文件。
$hash_repository->{$dirName} = [@$arr_ref_fileList];
如果要检查的目录本身包含目录,您可能希望使脚本递归。