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::Spec
和 splitpath
是正确的方法。
阅读就像在散列上使用 "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
我正在努力实现以下目标:
我有一个包含随机文件列表的 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::Spec
和 splitpath
是正确的方法。
阅读就像在散列上使用 "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