Perl - 使用数组作为值创建和自动化哈希表

时间:2015-10-26 07:56:31

标签: arrays perl hashmap hashtable key-value

我试图实现以下目标:

我有一个包含随机文件列表的txt文件, 我想按路径对文件进行排序。

例如: 清单是:

c:\foo\bar\bbb.txt
c:\foo\bar\ccc.txt
d:\xxx\eee.txt
c:\foo\bar\aaa.txt
d:\xxx\ddd.txt

我想要这样的数据:

[KEY]
c:\foo\bar
[Values]
aaa.txt
bbb.txt
ccc.txt

[KEY]
d:\xxx\
[Values]
ddd.txt
eee.txt

我想过使用哈希映射,数组作为值。 我无法弄清楚当前的语法。

这是我的一些代码:

open (FILELIST, "$file") or ...;
my @filelist = <FILELIST>;
my %uniqueFolders;
    foreach $fileList_line (@filelist)
      {
         my $file = (File::Spec::Win32->splitpath($fileList_file))[1];
           if ( !$file ~~ @temp = keys %uniqueFolders)
             {
                 %uniqueFolders{$file} = ????????????

              }

如何访问数组以添加/读取它?

如何自动化,以便在需要时创建数组。

帮助,

感谢。

2 个答案:

答案 0 :(得分:4)

你要走下一条死胡同。您不需要创建数组,因为perl具有名为autovivification的功能。

通过在散列中写入数组,它是自动创建的。

所以你的任务很简单:

push ( @{ $uniqueFolders{$key}}, $value) ;

拆分文件名,以便拥有密钥和值。 File::Specsplitpath是正确的方法。

阅读就像在哈希上使用“键”一样简单。

e.g。

foreach my $path ( keys %uniqueFolders ) {
    print "[KEY]\n";
    print "$path\n"; 
    print "[Values]\n";
    print join ( "\n", @{$uniqueFolders{$path}} ),"\n"
}

答案 1 :(得分:2)

您可以简化算法,

use strict;
use warnings;

use File::Basename;

local @ARGV = "list_of_files.txt";
my %seen;
for (sort <>) {
  my $d = dirname($_);
  $seen{$d}++ or print qq(\n[KEY]\n$d\n[Values]\n);
  print basename($_);
}

输出

[KEY]
c:\foo\bar
[Values]
aaa.txt
bbb.txt
ccc.txt

[KEY]
d:\xxx
[Values]
ddd.txt
eee.txt