2011-09-23 91 views
3

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

我会很感激任何指针。

回答

2

如果我理解正确,这似乎是做招(末尾用自卸车()散列的印刷只是向你展示什么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"; 
+0

这种方法呢?谈到哈希时,我对Perl很陌生。(my $ line = ){ my($ filename,$ dir)= fileparse($ line); $ data _ {$ dir} {file} = $ filename; $ data _ {$ dir} {count} ++; } – farhany

+0

而不是自己粘贴路径,使用File :: Spec(或建立在它上面的东西)。 –

4

哈希值必须是标量,所以真正的问题是如何将两个值合并为一个标量。引用是标量,所以引用散列会起作用。

$data{$dir} = { 
    file_count => [email protected], 
    files  => \@files, 
}; 

请注意,文件数量是多余的。 [email protected]{ $data{$dir}{files} }可用于文件计数。如果您选择摆脱这种冗余,可以使用

$files{$dir} = \@files; 

的文件数可作为

[email protected]{ $files{$dir} } 

和文件是作为

@{ $files{$dir} } 

(该0+能在标量上下文中省略)。

+5

在我看来,'scalar @ files'比'0 + @ files'更具可读性。 –

+0

@Alan Haggai Alavi,你是我听到的第一个这样说的人,很多人告诉我相反。大多数人认为数字化操作符('0 +')更清晰,因为它表示一个数字将被返回。我可惜认为加法在名单上工作的人。 – ikegami

+0

@Alan Haggai Alavi,'“”.'是一个字符串操作符,'0 +'是一个数字化操作符,'!!'是一个布尔化操作符。有些时候你必须使用其中的一种而不是'标量',这些时间比不能使用这些时间的时间更多,并且必须使用'标量',所以我建议你习惯它们。您似乎对缺乏可读性和缺乏熟悉感感到困惑。 – ikegami

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

相关问题