Лучший способ предотвратить вывод дублированного элемента в Perl в реальном времени во время цикла - PullRequest
0 голосов
/ 04 мая 2009

Я вижу много «связанных» вопросов, но ни один, на который я смотрел, не отвечает этому конкретному сценарию.

Во время цикла while / for, который анализирует результирующий набор, сгенерированный из оператора выбора SQL, каков наилучший способ предотвратить вывод следующей строки, если строка перед ней содержит те же данные поля (будь то 1-й поле или х-ное поле)?

Например, если две строки:

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

Каков наилучший способ печати только первой строки, основываясь на том факте, что EML-E одинаков в обеих строках?

Прямо сейчас я делаю это:

  • Сохранение первого поля (характерного для моего сценария) в массив из 2 элементов (dupecatch [1])
  • Проверка, если dupecatch [0] = dupcatch [1] (duplicate - escape-цикл с использованием '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];
    }
    

Ответы [ 2 ]

7 голосов
/ 04 мая 2009

Это стандартный способ, если вы заботитесь только о дублирующих элементах в строке, но $ 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();
}
1 голос
/ 04 мая 2009

Я предлагаю использовать DISTINCT в вашем выражении SQL. Возможно, это самое простое решение.

...