Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止在循环期间在Perl中实时输出重复项的最佳方法_Perl_Loops_Duplicates - Fatal编程技术网

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

防止在循环期间在Perl中实时输出重复项的最佳方法,perl,loops,duplicates,Perl,Loops,Duplicates,我看到很多“相关”的问题出现了,但我所看到的没有一个能回答这个特定场景 在解析SQL select语句生成的结果集的while/for循环期间,如果前一行包含相同的字段数据(无论是第1个字段还是第xth个字段),那么防止输出下一行的最佳方法是什么 例如,如果两行是: ('EML-E','jsmith@mail.com','John','Smith') ('EML-E','jsmith2@mail.com','John','Smith') 基于“EML-E”在两行中相同的事实,仅打印第一行的最佳

我看到很多“相关”的问题出现了,但我所看到的没有一个能回答这个特定场景

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

例如,如果两行是:

('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]通常命名为$old,$dupecatch[1]通常只是有问题的变量,那么这就是标准方法。可以看出数组不是很合适,因为您只参考了它的索引

如果要避免所有重复,可以使用%seen散列:

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语句中使用DISTINCT。这可能是迄今为止最简单的修复方法。

为什么在while循环中使用typeglob?这就是模块的工作方式。。。我对Plibdata不太了解,我只是使用它,因为它是基于需求工作的(折叠相邻的重复行),这将是一个错误:distinct将从(“foo”、“bar”、“foo”、“foo”)中删除除第一个“foo”之外的所有“foo”,而只有最后一个应该删除。我在前两个选择中使用distinct,如果我想让distinct按预期的方式工作,我必须将第二个select转储到临时表中,然后将distinct关闭。我认为太多的临时表并不符合我的最佳利益。这是有道理的。。。%SEED hash是关于什么的?哦,现在我记得为什么我使用数组,$rowfetch在内部while循环的每次迭代中都会改变。这就是为什么我在完成内部循环后设置旧值的原因。我本可以使用两个变量,但数组似乎更好。只有将数组用作集合时,它们才会更好。您仅将其与索引一起使用,因此不将其用作集合。名为$old的变量更具描述性。我将在答案中添加一个%seen散列的示例。