如果您没有时间,请告诉我是否必须更简洁,只需回答上述问题并跳过以下文字:
我只是希望你完全理解这个问题。非常感谢。
背景:我正在制作搜索引擎(这只是代码的一小部分......所以它可能对变化很敏感......而不是你的问题)。搜索引擎必须输出符合特定标准的所有句子。因此,如果句子包含正确的术语,它将被置于较大标题下的子标题下(以大写字母表示)。大写标题按字母顺序排序。我希望子标题按频率排序。
目标:我想通过将所有相应的匹配连接到子标题来按频率排序,然后将每个子标题元素最大的排在第一位。我该怎么做呢? (例如$ array [0]和$ array [1]需要连接)
APOLOGY:我是Perl和这个网站的新手,所以我不确定这种格式是否太长......我很确定并且抱歉我的代码很粗糙,但是它有效
我们走了:
LEGEND1:$ sortedallgramfunc的格式为:XCOMP
LEGEND2:$ headmatches(子标题)的格式为: xcomp 的费用为: 移动 < /强> 的
LEGEND3:$ sentmatches的格式为:MATCH#1已发送。 29 为了获得这些有机分子,动物必须 - 消耗 - 能量移动自己
如果子标题也有MATCH#2,那么它和所有相关的句子应该在只有1个匹配的子标题之前打印
foreach my $sortedallgramfunc (@sortedallgramfunc) {
my @sepmatches; ## MOVED DOWN HERE TO TEST, MAYBE MOVE BACK depending on sol'n
print ("\n",uc $sortedallgramfunc,"\n\n");# Which gramfunc is being shown?
for (my $l=0; $l <= @headmatches; $l++) {
if (defined( $headmatches[$l] ) and $headmatches[$l] =~ /$sortedallgramfunc/) {
unless ($seenmatches{ $headmatches[$l] }++) {
push (@sepmatches, $headmatches[$l]);
my $count = 1;
my @allsents; ## use for all sents that go under heading, add to heading to get @allmatches
for (my $m=0; $m <= @sentmatches; $m++) {
if ( defined( $sentmatches[$m]) and $sentmatches[$m] =~ /\s\S\S$firstmatches[$l]\S\S\s/ and $sentmatches[$m] =~ /\s\S\S$secondmatches[$l]\S\S\s/) { ##We know $l and $m are matching
push (@allsents, "MATCH #$count $sentmatches[$m]"); # unless $seens{ $sentmatches[$m] }++);
$count++;
}
}
push (@sepmatches, @allsents);
##$sepmatches[0] is header, [1] is all sentences etc. EVEN - header, ODD - sent
## NOW WANT TO join headers and sentences (0 and 1 etc.) in @allmatches<====
# SO I can us the following line to hopefully sort by frequency of matches under each subheading: @sortedallmatches = sort {length $a cmp length $b } @allmatches;
}
}
}print @sepmatches;
}
答案 0 :(得分:4)
你可能想要List :: MoreUtil的natatime。这与许多其他问题相同,例如How do I read two items at a time in a Perl foreach loop?。