在循环期间实时防止在Perl中输出重复项的最佳方法

Che*_*eso 0 perl loops duplicates

我看到很多"相关"问题出现了,但我没有看到回答这个具体情况.

在解析从SQL select语句生成的结果集的while/for循环期间,如果前一行包含相同的字段数据(无论是第1个字段还是第1个字段),防止下一行输出的最佳方法是什么?第x场)?

例如,如果两行是:

('EML-E','jsmith@mail.com','John','Smith')
('EML-E','jsmith2@mail.com','John','Smith')
Run Code Online (Sandbox Code Playgroud)

基于'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];
    }
    
    Run Code Online (Sandbox Code Playgroud)

Cha*_*ens 7

如果你只关心一行中的重复项,那就是标准方法,但是$ dupecatch [0]通常被命名为$ old而$ dupecatch [1]通常只是有问题的变量.你可以告诉数组不合适,因为你只引用它的索引.

如果要避免所有重复项,可以使用%see hash:

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