在Perl中创建哈希

时间:2011-09-23 20:41:45

标签: perl hash

如何在Perl中创建一个使用目录名作为键的哈希值,然后将目录中的文件数以及每个文件的名称存储起来?是否可以使用散列哈希或数组散列?

我很感激任何指示。

3 个答案:

答案 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};

您可以read more about hashes herehere