Perl - 使用数组作为值创建并自动执行散列 table

Perl - create and automate a hash table with arrays as the values

我正在努力实现以下目标:

我有一个包含随机文件列表的 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} = ????????????

              }

如何从中访问数组 add/read?

以及我如何自动化它以便在需要时创建数组..

求助,

谢谢。

你正在走入死胡同。你不需要创建数组,因为 perl 有一个叫做 autovivification.

的特性

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

所以你的任务很简单:

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

拆分您的文件名,使您拥有键和值。 File::Specsplitpath 是正确的方法。

阅读就像在散列上使用 "keys" 一样简单。

例如

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

你可以简化你的算法,

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