我试图实现以下目标:
我有一个包含随机文件列表的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} = ????????????
}
如何访问数组以添加/读取它?
如何自动化,以便在需要时创建数组。
帮助,
感谢。
答案 0 :(得分:4)
你要走下一条死胡同。您不需要创建数组,因为perl具有名为autovivification的功能。
通过在散列中写入数组,它是自动创建的。
所以你的任务很简单:
push ( @{ $uniqueFolders{$key}}, $value) ;
拆分文件名,以便拥有密钥和值。 File::Spec
和splitpath
是正确的方法。
阅读就像在哈希上使用“键”一样简单。
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