[Cascavel-pm] Gerar lista...
Luis Motta Campos
luismottacampos em yahoo.co.uk
Sexta Agosto 3 03:51:37 PDT 2007
On Aug 2, 2007, at 8:31 PM, Nelson Ferraz wrote:
> On Aug 2, 2007, at 6:54 PM, Rafael Lebrão Martins wrote:
>> Neste caso, como extrair da "lista 2" apenas as palavras que não
>> contêm na lista "@array" e guardá-las numa terceira lista??
>
> Esse tipo de problemas (verificar a intersecção ou diferença entre
> dois conjuntos) é resolvido com hashes.
Sim, Nélson... com hashes, hash-slices, não com foreach... ;-)
Eu "patcheei" o teu problema um pouquinho... ;-)
Dominar manipulação de arrays, listas e hashes é uma coisa muito
importante se você quer ser faixa-preta em perl, Rafael. ;-) Se você
não entender o que eu fiz, por favor sinta-se à vontade para perguntar.
A pesar de não ser intuitivo, /delete/ é uma palavra-chave do perl
poderosíssima para manipular hashes. Ela está listada no manual
online do perl, leia "perldoc -f delete" para os detalhes sujos ;-)
> my @list1 = qw( foo bar baz );
> my @list2 = qw( foo bar lalala );
> my %hash1 = map( ( $_ => 1 ), @list1 );
> my %hash2 = map( ( $_ => 1 ), @list2 );
>
> # agora trabalhamos com os conjuntos
>
> my %uniao = (%hash1, %hash2);
>
> my %diferenca = %hash2;
> my %interseccao = delete @diferenca{ @list1 };
> # %diferenca agora contem os valores de 2 que não estão em 1
>
> # foreach (keys %uniao ) {
> # if ( $hash1{$_} && $hash2{$_} ) {
> # $interseccao{$_} = 1;
> # } else {
> # $diferenca{$_} = 1;
> # }
> # }
>
> # imprime os resultados
>
> print "hash1: ", join(",", keys %hash1), "\n";
> print "hash2: ", join(",", keys %hash2), "\n";
>
> print "Uniao: ", join(",", keys %uniao), "\n";
>
> print "Diferenca: ", join(",", keys %diferenca), "\n";
> print "Interseccao: ", join(",", keys %interseccao), "\n";
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}
Mais detalhes sobre a lista de discussão Cascavel-pm