回答
如果我理解正确,这似乎是做招(末尾用自卸车()散列的印刷只是向你展示什么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";
哈希值必须是标量,所以真正的问题是如何将两个值合并为一个标量。引用是标量,所以引用散列会起作用。
$data{$dir} = {
file_count => [email protected],
files => \@files,
};
请注意,文件数量是多余的。 [email protected]{ $data{$dir}{files} }
可用于文件计数。如果您选择摆脱这种冗余,可以使用
$files{$dir} = \@files;
的文件数可作为
[email protected]{ $files{$dir} }
和文件是作为
@{ $files{$dir} }
(该0+
能在标量上下文中省略)。
在我看来,'scalar @ files'比'0 + @ files'更具可读性。 –
@Alan Haggai Alavi,你是我听到的第一个这样说的人,很多人告诉我相反。大多数人认为数字化操作符('0 +')更清晰,因为它表示一个数字将被返回。我可惜认为加法在名单上工作的人。 – ikegami
@Alan Haggai Alavi,'“”.'是一个字符串操作符,'0 +'是一个数字化操作符,'!!'是一个布尔化操作符。有些时候你必须使用其中的一种而不是'标量',这些时间比不能使用这些时间的时间更多,并且必须使用'标量',所以我建议你习惯它们。您似乎对缺乏可读性和缺乏熟悉感感到困惑。 – ikegami
个人几乎都是我用散列引用,而不是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};
- 1. Perl:散列中数组的大小,在另一个散列
- 2. Perl:在散列内部的标量变量中创建一个数组ref
- 3. 如何在perl中创建散列哈希?
- 4. 如何在perl中创建对象的散列
- 5. 如何在Perl中创建散列哈希?
- 6. 在Perl中,你如何创建和使用散列数组?
- 7. 如何创建一个散列表
- 8. 创建散列
- 9. 在sql server中为一组行创建一个散列
- 10. Perl - 创建一个蛮力列表
- 11. Perl - 散列散列(散列和标量)?
- 12. 散列在散列Perl代码问题
- 13. 修改在Perl的散列内散列
- 14. 在散列时将多个值赋给perl中的一个键
- 15. 在奇怪的行为循环中创建一个散列
- 16. 如何在C中创建一个字符串的md5散列?
- 17. 如何从Perl中的哈希数组创建哈希散列?
- 18. 从json编码/解码中使用变量创建散列perl
- 19. 创建一个ArrayList,在每个值的散列表
- 20. 在PHP中创建自己的散列?
- 21. 创建在Perl的子程序,将采取的哈希从散列的散列作为参数,并从该散列打印出的其中一个值
- 22. 在perl中移动一个未命名的散列?
- 23. 如何从两个散列创建单个散列,其中一个散列的值是另一个散列的键子集的子集?
- 24. 的Perl:在嵌套散列
- 25. 经由命令行参数发送散列的散列从一个Perl CGI程序到另一个Perl脚本
- 26. 在任一个散列或散列
- 27. Perl CSV来散列
- 28. 从一个文件中取多行并创建散列
- 29. 如何在Perl中创建列输出?
- 30. 如何有效地创建连续数字的perl散列?
这种方法呢?谈到哈希时,我对Perl很陌生。(my $ line =){ my($ filename,$ dir)= fileparse($ line); $ data _ {$ dir} {file} = $ filename; $ data _ {$ dir} {count} ++; } –
farhany
而不是自己粘贴路径,使用File :: Spec(或建立在它上面的东西)。 –