如何在Perl中创建一个使用目录名作为键的哈希值,然后将目录中的文件数以及每个文件的名称存储起来?是否可以使用散列哈希或数组散列?
我很感激任何指示。
答案 0 :(得分:4)
哈希值必须是标量,所以真正的问题是如何将两个值合并为一个标量。引用是标量,因此对哈希的引用将起作用。
$data{$dir} = {
file_count => 0+@files,
files => \@files,
};
请注意,文件计数是多余的。 0+@{ $data{$dir}{files} }
可用于文件计数。如果您选择摆脱这种冗余,可以使用
$files{$dir} = \@files;
文件计数可以
0+@{ $files{$dir} }
,文件可以
@{ $files{$dir} }
(标量上下文中可以省略0+
。)
答案 1 :(得分:2)
如果我理解正确,这似乎可以解决问题(在最后使用Dumper()打印哈希只是为了向您展示hashref包含的内容):
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $dir = $ENV{PWD};
opendir( DIR, $dir ) or die $!;
my @files = grep { -f "$dir/$_" } readdir( DIR );
my $hash = {
$dir => {
count => scalar( @files ),
files => \@files,
}
};
print Dumper( $hash ), "\n";
答案 2 :(得分:2)
我个人几乎总是使用哈希引用而不是perl哈希(而arrayrefs也是perl数组)。例如:
my $dirs = {
'/home/user' => [ '.profile', '.bashrc', 'My_pic.png' ],
'/root' => [ '.profile', '.zshrc' ]
};
my $var = { (...) }
进行哈希引用,=>
只是逗号,
的同义词,但允许区分哈希键和值。 [ (...) ]
生成匿名数组引用,该引用被指定为哈希值。
您不必存储文件数等冗余信息,您只需在标量上下文中评估数组:
my $root_files = $dirs->{'/root'};
$size = scalar @{$root_files};