Pergunta

Eu estou empurrando elementos em uma matriz durante um tempo comunicado. Cada elemento é o nome de um professor. Não acaba sendo nomes de professores duplicados na matriz quando o laço termina. Às vezes, eles não são bem próximas umas das outras na matriz, às vezes eles são.

Como posso imprimir apenas os valores exclusivos em que matriz após seus valores recebendo acabados empurrado para isso? Sem ter para analisar toda a matriz cada vez Quero imprimir um elemento.

Aqui está o código depois que tudo foi empurrado para dentro da matriz:

$faculty_len = @faculty;
$i=0;
while ($i != $faculty_len)
{
        printf $fh '"'.$faculty[$i].'"';
        $i++;
}   
Foi útil?

Solução

use List::MoreUtils qw/ uniq /;
my @unique = uniq @faculty;
foreach ( @unique ) {
    print $_, "\n";
}

Outras dicas

Sua melhor aposta seria a utilização de um (basicamente) built-in ferramenta, como uniq ( como descrito por innaM) .

Se você não tem a capacidade de usar uniq e quer preservar a ordem, você pode usar o grep para simular isso.

my %seen;
my @unique = grep { ! $seen{$_}++ } @faculty;
# printing, etc.

Este primeiro dá-lhe um hash onde cada chave é cada entrada. Então, você iterar sobre cada elemento, contando quantos deles existem, e adicionando o primeiro. (Atualizado com comentários de brian d foy)

Eu sugiro empurrando-o em um hash. assim:

my %faculty_hash = ();
foreach my $facs (@faculty) {
  $faculty_hash{$facs} = 1;
}
my @faculty_unique = keys(%faculty_hash);
@array1 = ("abc", "def", "abc", "def", "abc", "def", "abc", "def", "xyz");

@array1 = grep { ! $seen{ $_ }++ } @array1;

print "@array1\n"; 

Esta pergunta é respondida com várias soluções em perldoc. Basta digitar na linha de comando:

perldoc -q duplicate

Por favor nota: Algumas das respostas contendo um hash vai mudar a ordem da matriz. Hashes não tem qualquer tipo de ordem, assim que começar as chaves ou valores fará uma lista com uma ordenação indefinida.

Este doen't aplica a grep { ! $seen{$_}++ } @faculty

Este é um comando de um forro para imprimir linhas exclusivas, a fim ela aparece.

perl -ne '$seen{$_}++ || print $_' fileWithDuplicateValues

Eu só descobri hackneyed 3 liner, apreciar

my %uniq; 
undef @uniq(@non_uniq_array); 
my @uniq_array = keys %uniq; 

Apenas uma outra maneira de fazê-lo, útil somente se você não se preocupam com fim :

my %hash;
@hash{@faculty}=1;
my @unique=keys %hash;

Se você quiser evitar declarar uma nova variável, você pode usar a variável global de alguma forma underdocumented % _

@_{@faculty}=1;
my @unique=keys %_;

Se você precisa para processar a lista Faculdade de forma alguma, um mapa sobre a matriz convertido para um hash para coalescente chave e, em seguida, classificar chaves é outra boa maneira:

my @deduped = sort keys %{{ map { /.*/? ($_,1):() } @faculty }};
print join("\n", @deduped)."\n";

Você processar a lista alterando o regex /.*/ para selecionar ou analisar e capturar em conformidade, e você pode uma saída ou mais mutantes, chaves não-exclusivo por passe por fazer ($_,1):() arbitrariamente complexa.

Se você precisar modificar os dados em voo com um regex substituição, dizem para remover pontos dos nomes (s/\.//g), em seguida, uma substituição de acordo com o padrão acima irá transformar a matriz @faculty original devido a aliasing $_. Você pode obter em torno $_ aliasing, fazendo uma cópia anônima do array @faculty (veja a chamada "bebê carrinho" operador ):

my @deduped = sort keys %{{ map {/.*/? do{s/\.//g; ($_,1)}:()} @{[ @faculty ]} }};
print join("\n", @deduped)."\n";
print "Unmolested array:\n".join("\n", @faculty)."\n";

Em versões mais recentes do Perl, você pode passar keys um hashref, e você pode usar a substituição não destrutivo:

my @deduped = sort keys { map { /.*/? (s/\.//gr,1):() } @faculty };

Caso contrário, os grep ou $seen[$_]++ soluções noutro local pode ser preferível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top