2009-05-04 43 views
0

我看到很多「相關」的問題,但我沒有看到回答這個特定場景的問題。避免在循環中實時輸出Perl中重複項的最佳方法

在while/for循環解析從SQL select語句生成的結果集的過程中,如果它之前的行包含相同的字段數據(不管它是第一場或第x場)?

例如,如果兩行分別爲:

('EML-E','[email protected]','John','Smith') 
('EML-E','[email protected]','John','Smith') 

什麼是隻有「EML-E」是兩行相同的打印基於這樣的事實,第一行的最佳方式是什麼?

現在,我這樣做:

  • 存儲第一字段(特定於我的方案)轉換成2個元素的數組(dupecatch [1])
  • 察看dupecatch [0] = dupcatch [1](式兩份 - 逃逸循環中使用的')
  • 行處理完畢後,設置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]; 
    } 
    
+2

你爲什麼在while循環中使用typeglob? – 2009-05-04 14:55:25

+0

多數民衆贊成在模塊的工作方式...我不太瞭解Plibdata,我只是使用它,因爲它的工作原理 – CheeseConQueso 2009-05-04 15:10:07

回答

7

這就是標準方式,如果你只關心一行中的重複項目,但是$ dupecatch [0]通常被命名爲$ old,而$ 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(); 
} 
+0

...有什麼看到哈希所有關於? – CheeseConQueso 2009-05-04 15:12:16

1

我建議在你的SQL語句中使用DISTINCT。這可能是迄今爲止最簡單的修復方法。