我是一个弱perl用户(和数组的操纵器),这个问题让我感到困惑。希望有人可以帮忙!
我有一个包含以下数据类型的源文件(大大简化):
URL: 22489196
Keywords: Ball, Harga, Call, Dall, Eall, Jarga, Fall
URL: 22493265
Keywords: Hall, Iall, Yarga, Jall, Zarga, Kall
中断alpha顺序(Harga等)的词是“限定词”。我需要的最终结果是:
22489196
Ball--Harga
Call
Dall
Eall--Jarga
Fall
22493265
Hall
Iall--Yarga
Jall--Zarga
Kall
我尝试了各种“for”循环,将这些术语推入第二个数组,并将原始数组转换为条件的条件连接,但我仍然最终缺少或有额外的术语。任何人都可以建议如何做到这一点?非常感谢!
ADDED:这是我的一部分杂乱代码的一次迭代:
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;
答案 0 :(得分:2)
好吧,“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;
}