perl—对以逗号分隔的源进行排序,该源包含;限定词“;

perl—对以逗号分隔的源进行排序,该源包含;限定词“;,perl,qualifiers,Perl,Qualifiers,我是一个弱perl用户(也是数组的操纵者),这个问题一直困扰着我。希望有人能帮忙 我有一个包含以下类型数据的源文件(大大简化): 中断阿尔法顺序的单词(哈尔加等)是“限定词”。我需要的最终结果是: 22489196 Ball--Harga Call Dall Eall--Jarga Fall 22493265 Hall Iall--Yarga Jall--Zarga Kall 我尝试了各种“for”循环,将术语放入第二个数组,并根据其术语的条件串联来移动原始数组,但最终仍然会出现缺少或额

我是一个弱perl用户(也是数组的操纵者),这个问题一直困扰着我。希望有人能帮忙

我有一个包含以下类型数据的源文件(大大简化):

中断阿尔法顺序的单词(哈尔加等)是“限定词”。我需要的最终结果是:

22489196

Ball--Harga
Call
Dall
Eall--Jarga
Fall

22493265

Hall
Iall--Yarga
Jall--Zarga
Kall
我尝试了各种“for”循环,将术语放入第二个数组,并根据其术语的条件串联来移动原始数组,但最终仍然会出现缺少或额外的术语。有人能建议怎么做吗?非常感谢

补充:这里是我混乱代码的一部分迭代:

while(){
如果(/URL\:/){
打印“$\u\n”;
}
如果(/Keywords\:/){
s/关键词\://;
chomp();
my@terms=split',',$;
我的@bakterms=反向@terms;
我的$noTerms=@terms;
my$IzItOdd=$noTerms%2;
#my$ctr=$noTerms++;
对于($i=0;$i好吧,“Harga”不会打断字母顺序,“Call”会打断字母顺序,所以限定词实际上是打断字母顺序的词之前的词

my $keywords = ...;  # 'Ball, Harga, Call, Dall, Eall, Jarga, Fall'
my @keywords = split /\s*,\s*/, $keywords;
my $prev_keyword = '';
while (@keywords) {
    my $keyword = shift(@keywords);

    my $qualifier;
    if (@keywords >= 1 && $keyword eq $prev_keyword) {
       $qualifier = shift(@keywords);
    }
    elsif (@keywords >= 2 && $keywords[0] gt $keywords[1]) {
       $qualifier = shift(@keywords);
    }

    if (defined($qualifier)) {
       print("$keyword--$qualifier\n");
    } else {
       print("$keyword\n");
    }

    $prev_keyword = $keyword;
}

请展示一些您尝试过的代码。为什么输出中的一些单词之间会出现破折号?您不能用比“无序”更好的方式(列表、模式等)定义“限定符”吗?您如何处理“…,Hall,Harga,Iall,…”@Ekkehard.Horner:有2.286个可能的限定符,所有这些都只是对“基本项”(例如,Jall可以单独出现,也可以由Zarga“扩展”)“Hall、Harga、Iall”模式在统计上是罕见的,因此我可以手动检查结果的“假阳性”。这是否澄清了一点?@simbabque:输出中的破折号将“基本项”与“限定符”分开“--这有帮助吗?限定符对
$qualifier=~/[A-Z]arga/
测试是否为阳性?@ikegami,这离我需要的东西更近了--谢谢!有没有办法处理像“…,老鼠,老鼠,近亲繁殖,…”这样的例子,其中“老鼠”是一个基本术语,“老鼠,近亲繁殖”列表中紧接着的是另一个限定词吗?@ikegami:对不起,应该澄清一下:输出应该是“老鼠”,然后是“老鼠——近亲繁殖”。谢谢!更新。本可以使用“向前看”来完成此操作,但我认为“向后看”更合适。@ikegami:非常感谢。我仍然需要更仔细地检查数据,但这段代码是一个巨大的帮助!@ikegami:这比我将出现的混乱要简单得多,并且让我的输出更接近我需要的内容,因此我将很高兴检查一下。不幸的是,在继续之前,我必须检查数据中限定符的频率。你帮了我很大的忙!
while (<FILE>) {

    if (/URL\:/) {

        print "$_\n";
    }

    if (/Keywords\: /) {

        s/Keywords\: //;
        chomp();

        my @terms    = split ', ', $_;
        my @bakterms = reverse @terms;
        my $noTerms  = @terms;
        my $IzItOdd  = $noTerms%2;
        #my $ctr = $noTerms++;

        for ($i = 0; $i <= $#bakterms; $i++){

            my $j = $i+1;

            if ($j <= $#bakterms) {

                my $one = $bakterms[$i];
                my $two = $bakterms[$j];

                if ($two gt $one) { # i.e., if $two is alphabetically AFTER $one

                    push @ary3, $bakterms[$i];
                    $disarry = 1;
                    my $interloper = $bakterms[$j+1].= "--" . $two;
                    push @ary3, $interloper;
                    shift @bakterms;
                    #$ctr--;
                    shift(@bakterms);
                    #$ctr--;
                }
                else {

                    push @ary3, $bakterms[$i];
                    #shift(@bakterms);
                    shift @bakterms;
                    $disarry = 0;
                }
            }
        }
        @ary3 = sort @ary3;

        foreach my $term (@ary3) {

            print "** $term\n";
        }

        @ary3 = ();
        print"\n";
    }
}
exit 0;
my $keywords = ...;  # 'Ball, Harga, Call, Dall, Eall, Jarga, Fall'
my @keywords = split /\s*,\s*/, $keywords;
my $prev_keyword = '';
while (@keywords) {
    my $keyword = shift(@keywords);

    my $qualifier;
    if (@keywords >= 1 && $keyword eq $prev_keyword) {
       $qualifier = shift(@keywords);
    }
    elsif (@keywords >= 2 && $keywords[0] gt $keywords[1]) {
       $qualifier = shift(@keywords);
    }

    if (defined($qualifier)) {
       print("$keyword--$qualifier\n");
    } else {
       print("$keyword\n");
    }

    $prev_keyword = $keyword;
}