Perl:我需要以两个为一组连接数组的元素,以便按频率对输出进行排序

时间:2011-05-27 17:08:18

标签: perl

如果您没有时间,请告诉我是否必须更简洁,只需回答上述问题并跳过以下文字:

我只是希望你完全理解这个问题。非常感谢。

背景:我正在制作搜索引擎(这只是代码的一小部分......所以它可能对变化很敏感......而不是你的问题)。搜索引擎必须输出符合特定标准的所有句子。因此,如果句子包含正确的术语,它将被置于较大标题下的子标题下(以大写字母表示)。大写标题按字母顺序排序。我希望子标题按频率排序。

目标:我想通过将所有相应的匹配连接到子标题来按频率排序,然后将每个子标题元素最大的排在第一位。我该怎么做呢? (例如$ 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;
}

1 个答案:

答案 0 :(得分:4)

你可能想要List :: MoreUtil的natatime。这与许多其他问题相同,例如How do I read two items at a time in a Perl foreach loop?