2015-02-10 1 views
-1

У меня есть набор данныхЧтобы удалить повторяющиеся элементы из массива в Perl

10-101570715-101609901-hsa-mir-3158-1 10-101600739-101609661-ENSG00000166171 10-101588288-101609668-ENSG00000166171 10-101588325-101609447-ENSG00000166171 10-101594702-101609439-ENSG00000166171 10-101570560-101596651-ENSG00000166171 

10-103389007-103396515-hsa-mir-1307 10-103389041-103396023-ENSG00000173915 10-103389050-103396074-ENSG00000173915 10-103389050-103396441-ENSG00000173915 10-103389050-103396466-ENSG00000173915 10-103389050-103396466-ENSG00000173915 

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

open (fh, "file1"); 
while ($line=<fh>) 
{ 
chomp ($line); 
@array=$line; 
my @unique =(); 
my %Seen =(); 
foreach my $elem (@array) 
    { 
    next if $Seen{ $elem }++; 
    push @unique, $elem; 
    } 
print @unique; 
} 
+1

'использовать строгий; использовать предупреждения; используйте Data :: Dumper; print Dumper \% Seen; 'Разве вы не ищете дубликаты, используя полные строки? –

+0

нет, не дублируется с использованием полных строк, только поиск элементов, которые дублируются в строке –

ответ

5

хэш для обнаружения дубликатов:

my %seen; 
my @removeduplicate = grep { !$seen{$_}++ } @array; 

Для меня ниже код работает отлично:

use strict; 
use warnings; 

my %seen; 
open my $fh, "<", 'file.txt' or die "couldn't open : $!"; 
while (my $line = <$fh>) 
{ 
    chomp $line; 
    my @array = split (' ', $line); 
    my @removeduplicate = grep { !$seen{$_}++ } @array; 
    print "@removeduplicate\n"; 
} 
+0

, избыточные значения по-прежнему существуют –

+1

@MANAUWERRAZA: взгляните на мой отредактированный ответ. всегда используйте 'use warnings' и' use strict' и три аргумента для работы файла. – serenesat

+0

спасибо, код, написанный ранее, тоже работал, это было по моей чистой части небрежности. –