2015-10-26 43 views
0

我尝试实现以下目标:的Perl - 创建并自动化阵列哈希表的值

我有一个文件的随机列表, 我想通过自己的路径文件进行排序的TXT文件。

为eample: 列表是:

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} = ???????????? 

       } 

我如何访问数组中添加/从中读取?

,我怎么能这样在需要时创建阵列自动执行它..

帮助,

感谢。

回答

4

你正在走下一条盲巷。您不需要创建数组,因为perl有一个名为autovivification的功能。

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

所以,你的任务很简单,只要:

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

分裂您的文件名,你有一个键和值。 File::Specsplitpath是正确的方法。

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

例如

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

10倍的人。那做了工作:) –

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