【问题标题】:perl -- sorting a comma-separated source that has "qualifiers"perl - 对具有“限定符”的逗号分隔源进行排序
【发布时间】:2023-03-19 20:15:01
【问题描述】:

我是一个弱 perl 用户(和数组操纵者),这个问题让我很困惑。希望有人能帮忙!

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

URL: 22489196
Keywords: Ball, Harga, Call, Dall, Eall, Jarga, Fall

URL: 22493265
Keywords: Hall, Iall, Yarga, Jall, Zarga, Kall

打断字母顺序的词(Harga 等)是“限定词”。我需要的最终结果是:

22489196

Ball--Harga
Call
Dall
Eall--Jarga
Fall

22493265

Hall
Iall--Yarga
Jall--Zarga
Kall

我尝试了各种“for”循环,将术语推入第二个数组,并根据其术语的条件串联移动原始数组,但我仍然会丢失或额外的术语。谁能建议如何做到这一点?提前非常感谢!

添加:这是我杂乱代码的一部分的迭代:

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;

【问题讨论】:

  • 请显示一些您尝试过的代码。为什么输出中的某些单词之间有破折号?
  • 你不能用比“乱序”更好的方式(列表、模式、..)来定义“限定符”吗?你会如何处理“..., Hall, Harga, Iall, ...”?
  • @Ekkehard.Horner:有 2.286 个可能的限定词,所有这些都是对“基本术语”的简单“扩展”(例如,Jall 可以单独出现或被 Zarga “扩展”)。 “Hall, Harga, Iall”模式在统计上很少见,所以我可以手动检查结果中的“误报”。这是否说明了一点?
  • @simbabque:输出中的破折号将“基本术语”与“限定词”分开——这有帮助吗?
  • 限定符可以对$qualifier=~/[A-Z]arga/ 测试呈阳性吗?

标签: perl qualifiers


【解决方案1】:

嗯,“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;
}

【讨论】:

  • @ikegami,这更接近我的需要——谢谢!有没有办法处理像“..., Mice, Mice, Inbred, ...”这样的实例,其中“Mice”是一个基本术语,而“Mice, Inbred”是另一个紧随其后的限定术语?
  • @ikegami:抱歉,应该澄清一下:输出应该是“Mice”,然后是“Mice--Inbred”。谢谢!
  • 已更新。也可以为此使用前瞻,但我认为后瞻会更合适。
  • @ikegami:非常感谢。我仍然需要更仔细地检查数据,但这段代码是一个巨大的帮助!
  • @ikegami:这比我想出的那些乱七八糟的东西要简单得多,而且输出更接近我的需要,所以我很乐意给它一个检查。不幸的是,在继续之前,我必须检查数据中限定词的频率。你帮了大忙!
猜你喜欢
  • 1970-01-01
  • 2020-03-14
  • 2012-11-04
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
相关资源
最近更新 更多