2015-10-26 68 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