在Perl中创建哈希

3
在Perl中,如何创建一个哈希表,使用目录名作为键,然后存储目录中文件的数量以及每个文件的名称?是否可以使用哈希表或数组的哈希表?如果有任何指针,请提供。
3个回答

4

哈希值必须是标量,所以真正的问题是如何让两个值变成一个标量。引用是标量,因此对哈希的引用将起作用。

$data{$dir} = {
   file_count => 0+@files,
   files      => \@files,
};

请注意,文件计数是多余的。可以使用0+@{ $data{$dir}{files} }来获取文件计数。如果您选择消除这种冗余,可以使用:
$files{$dir} = \@files;

文件数量可通过以下方式获得:
0+@{ $files{$dir} }

文件可用于以下方式:

@{ $files{$dir} }

(在标量上下文中,0+可以省略。)

5
依我拙见,“scalar @files”比“0+@files”更易读。 - Alan Haggai Alavi
@Alan Haggai Alavi,你是我听到的第一个这么说的人,而许多人告诉我相反的意见。大多数人认为数字化运算符(0+)更清晰,因为它表示将返回一个数字。我为那些认为加法适用于列表的人感到遗憾。 - ikegami
@Alan Haggai Alavi,“”。“是字符串化运算符,0+”是数字化运算符,而“!!”是布尔化运算符。有时您必须使用其中之一而不是“scalar”,而这些时间比您不能使用它们并且必须使用“scalar”的时间更多,因此我建议您习惯于使用它们。您似乎将可读性不足与熟悉度不足混淆了。 - ikegami
"".0+!!并不是离散的运算符,它们是粘合在一起的运算符和操作数,执行隐式强制转换。在这种情况下,使用int @files作为指示性且无噪音的行号如何? - Richard Simões
@Richard Simões,“int”不仅仅是数字化。与“scalar”的论点相同:我看不出在这里使用“scalar”或“int”,并且在其他地方使用“0+”的原因。 - ikegami

2

如果我理解得正确,这似乎可以解决问题(结尾处使用Dumper()打印哈希是为了向您展示哈希引用包含的内容):

#!/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";

这种方法怎么样?当涉及到哈希表时,我对Perl非常陌生。while (my $line = ) { my($filename, $dir) = fileparse($line); $data_{$dir}{file}=$filename; $data_{$dir}{count}++; } - farhany
不要自己拼接路径,使用File::Spec(或基于它构建的东西)。 - brian d foy

2

个人而言,我几乎总是使用哈希引用而非 Perl 哈希表(也使用数组引用而非 Perl 数组)。例如:

my $dirs = {
     '/home/user' => [ '.profile', '.bashrc', 'My_pic.png' ],
     '/root'      => [ '.profile', '.zshrc' ]
};

my $var = { (...) } 会创建一个哈希引用,=> 与逗号 , 是同义词,但可以区分哈希键和值。 [ (...) ] 创建匿名数组引用,将其分配为哈希值。

您无需存储冗余信息,只需在标量上下文中计算数组即可:

my $root_files = $dirs->{'/root'};
$size = scalar @{$root_files};

你可以在这里阅读更多关于哈希的内容,并且在这里阅读更多

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接