我正在尝试比较包含目录文件列表的多个字符串数组.目标是确定每个目录中存在哪些文件以及哪些文件不存在.考虑:
List1 List2 List3 List4 a a e f b b d g c f a h@H_301_12@结果应该是:
列表1:
List1 List2 List3 List4 a yes yes yes no b yes yes no no c yes no no no@H_301_12@列表2:
List1 List2 List3 List4 a yes yes yes no b yes yes no no f no yes no yes@H_301_12@…
我可以遍历所有数组并遍历每个条目,遍历所有其他数组并执行grep:
for my $curfile (@currentdirfiles) { if( grep(/$curfile/,@otherarrsfiles) ) { // Set 'yes' } else { // set 'no' } }@H_301_12@我唯一担心的是我最终得到的是0 ^ 2n数量级.我可能无法对此做任何事情,因为无论如何我最终会遍历所有数组.一个改进可能在grep函数中,但我不确定.
有什么想法吗?
解决方法@H_301_41@
现在问题已被修改,这就产生了你想要的答案.它在O(n3)时间内工作,这对于问题是最佳的(有n3个输出).
#!/usr/bin/env perl
use strict;
use warnings;
#List1 List2 List3 List4
#a a e f
#b b d g
#c f a h
my(@lists) = ( { a => 1,b => 1,c => 1 },{ a => 1,f => 1 },{ e => 1,d => 1,a => 1 },{ f => 1,g => 1,h => 1 },);
my $i = 0;
foreach my $list (@lists)
{
analyze(++$i,$list,@lists);
}
sub analyze
{
my($num,$ref,@lists) = @_;
printf "List %d\n",$num;
my $pad = " ";
foreach my $i (1..4)
{
print "$pad List$i";
$pad = "";
}
print "\n";
foreach my $file (sort keys %{$ref})
{
printf "%-8s",$file;
foreach my $list (@lists)
{
my %dir = %{$list};
printf "%-8s",(defined $dir{$file}) ? "yes" : "no";
}
print "\n";
}
print "\n";
}@H_301_12@
我得到的输出是:
List 1
List1 List2 List3 List4
a yes yes yes no
b yes yes no no
c yes no no no
List 2
List1 List2 List3 List4
a yes yes yes no
b yes yes no no
f no yes no yes
List 3
List1 List2 List3 List4
a yes yes yes no
d no no yes no
e no no yes no
List 4
List1 List2 List3 List4
f no yes no yes
g no no no yes
h no no no yes@H_301_12@
#!/usr/bin/env perl use strict; use warnings; #List1 List2 List3 List4 #a a e f #b b d g #c f a h my(@lists) = ( { a => 1,b => 1,c => 1 },{ a => 1,f => 1 },{ e => 1,d => 1,a => 1 },{ f => 1,g => 1,h => 1 },); my $i = 0; foreach my $list (@lists) { analyze(++$i,$list,@lists); } sub analyze { my($num,$ref,@lists) = @_; printf "List %d\n",$num; my $pad = " "; foreach my $i (1..4) { print "$pad List$i"; $pad = ""; } print "\n"; foreach my $file (sort keys %{$ref}) { printf "%-8s",$file; foreach my $list (@lists) { my %dir = %{$list}; printf "%-8s",(defined $dir{$file}) ? "yes" : "no"; } print "\n"; } print "\n"; }@H_301_12@我得到的输出是:
List 1 List1 List2 List3 List4 a yes yes yes no b yes yes no no c yes no no no List 2 List1 List2 List3 List4 a yes yes yes no b yes yes no no f no yes no yes List 3 List1 List2 List3 List4 a yes yes yes no d no no yes no e no no yes no List 4 List1 List2 List3 List4 f no yes no yes g no no no yes h no no no yes@H_301_12@