最好的办法,以防止出的一个重复的项目在Perl在实时在一个循环

StackOverflow https://stackoverflow.com/questions/820423

  •  03-07-2019
  •  | 
  •  

我看到很多的'相关'的问题显示出来,但是没有我看着回答这个具体情况。

在一段时间/循环,分析结果设置产生的SQL选择的发言,什么是最好的办法,以防止下一个线被输出,如果行之前,它包含了相同的领域的数据(它是否会在第1段或第x场)?

例如,如果两行:

('EML-E','jsmith@mail.com','John','Smith')
('EML-E','jsmith2@mail.com','John','Smith')

什么是最好的方式来只打印的第一行基于一个事实,即'EML-E'是同在这两个行?

现在,我这样做:

  • 储存的第一个领域(特给我方案)成一种2-元件阵列(dupecatch[1])
  • 检查如果dupecatch[0]=dupcatch[1](重复逃脱的循环使用's')
  • 后行处理,设置dupecatch[0]=dupecatch[1]

    while ($DBS->SQLFetch() == *PLibdata::RET_OK)
    {
        $s=0; #s = 1 to escape out of inside loop
        while ($i != $array_len and $s==0)
        {
            $rowfetch = $DBS->{Row}->GetCharValue($array_col[$i]);
            if($i==0){$dupecatch[1] = $rowfetch;} #dupecatch prevents duplicate primary key field entries
            if($dupecatch[0] ne $dupecatch[1])
            {
                dosomething($rowfetch);
            }
            else{$s++;}
            $i++;
        }
        $i=0;
        $dupecatch[0]=$dupecatch[1];
    }
    
有帮助吗?

解决方案

那是标准的方式如果你只关心重复的项目中排,但是$dupecatch[0]通常是名为$老美元dupecatch[1]通常只是可变的问题。你可以告诉阵列是不合适的,因为你永远只能提到其指标。

如果你想要避免所有重复的可以使用%看过哈希:

my %seen;
while (defined (my $row = get_data())) {
    next if $seen{$row->[0]}++; #skip all but the first instance of the key
    do_stuff();
}

其他提示

我建议使用不同的SQL发言。这可能是迄今为止最简单的解决。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top