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'在两行中是否相同的事实,仅打印第一行的最佳方法是什么?
现在,我这样做:
处理完行后,设置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)如果你只关心一行中的重复项,那就是标准方法,但是$ 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)