【发布时间】: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