2015-10-26 2 views
0

им пытаются добиться:Perl - создать и автоматизировать хэш-таблицу с массивами в качестве значений

У меня есть текстовый файл с произвольным списком файлов, Я хочу, чтобы отсортировать файлы по их путям.

для 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::Spec и splitpath - правильный подход.

Чтение так же просто, как использование «ключей» на хеше.

например.

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