[SP-pm] Qual a diferença entre lista e array ? [Artigo]
Gabriel Vieira
gabriel.vieira at gmail.com
Sun Mar 14 15:49:34 PDT 2010
montavani++ # excelente iniciativa
mantovani++ # homenagem ao papai
2010/3/14 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com>:
> Por conveniência eu achei um artigo muito bom sobre lista e array na
> internet, achei de interesse global o conhecimento então traduzi.
> http://www.effectiveperlprogramming.com/blog/39
>
> ----------------------------------------------------
>
> Eu recentemente atualizei o Perl FAQ, para a resposta "Qual a
> diferença entre uma lista e um array?". A diferença entre os dados e
> as variáveis são muitas vezes perdidos por pessoas que começam sua
> jornada com uma linguagem de alto nível.
> <comentario_pessoal>
> Aprender Haskell me mostrou coisas incríveis que eu não via antes.
> </comentario_pessoal>
>
> Este tópico tem como objetivo abordar o primeiro capítulo do livro
> "Effective Perl Programming, 2nd Edition", especificamente esses 3
> itens:
>
> Item 9: Saber a diferença entre listas e arrays.
> item 10: Não atribua undef quando você quer uma lista vazia.
> <comentario_pessoas>
> Por exemplo você tem algo como:
> my @lista = funcao('foo');
> print scalar(@lista);
>
> # Se entrar no if, vai imprimir 3, porém se entrar no undef vai
> retornar 1 ao invés de 0.
> # Isso acontece, porque quando se retorna undef, você atribui o
> primeiro elemento do array como undef:
> # $array[0] = undef;
> # Se simplesmente você não quer nada, faça "return;".
> # print "O Eden é muito útil no IRC" unless @lista;
> # print "O Eden é muito útil no IRC" unless $scalar;
> # Ambos "prints" irão aparecer na tela se você fizer "return;" ao
> invés de "return undef"
>
> sub funcao {
>
> if(...) {
> return (1 .. 3); #Vai retornar uma lista, tudo bem.
> }
> else {
> return undef;
> }
>
> }
> </comentario_pessoal>
> item 12: Entendendo o contexto e como isso afeta os operadores.
>
> Aqui estão as respostas do perlfaq4:
>
> Uma lista é uma coleção de scalares não modificáveis. Um array é uma
> variável que guarda uma coleção de variáveis. Um array pode fornecer
> sua coleção para uma lista, assim como uma lista pode passar sua
> coleção para um array.
>
> # fatias
> ( 'dog', 'cat', 'bird' )[2,3];
> @animals[2,3];
>
> # iterador
> foreach ( qw( dog cat bird ) ) { ... }
> foreach ( @animals ) { ... }
>
> my @three = grep { length == 3 } qw( dog cat bird );
> my @three = grep { length == 3 } @animals;
>
> # fornecendo uma lista de argumentos
> wash_animals( qw( dog cat bird ) );
> wash_animals( @animals );
>
> Somente em arrays você pode, alterar os elementos como, adicionar e
> subtrair alguns scalares. Em uma lista você não pode fazer isso,
> porque os valores são fixos. Outras coisas que você pode fazer com
> array são: shift, unshift, push, pop e slice.
>
> Você também pode mudar o tamanho do array:
>
> $#animals = 1; # Agora o array tem 2 elementos
> $#animals = 10000; # Pré-estende o array para 10.001 elementos
> Você pode mudar um elemento de um array, mas você não pode mudar o
> elemento de uma lista:
>
> $animals[0] = 'Rottweiler';
> qw( dog cat bird )[0] = 'Rottweiler'; # syntax error!
>
> foreach ( @animals ) {
> s/^d/fr/; # funciona bem
> }
>
> foreach ( qw( dog cat bird ) ) {
> s/^d/fr/; # Erro! Modificar um valor só de leitura!
> }
>
> No entanto, se o elemento da lista é uma variável, aparenta que você
> pode mudar um elemento na lista. Porém, o elemento da lista é uma
> variável, e não um dado. Você não está mudando um elemento da lista,
> mas algo que o elemento da lista se refere. O elemento da lista em sí
> não muda: Ainda continua a mesma variável.
>
> você também tem que se preocupar com o contexto. Você pode atribuir um
> array a um scalar e pegar o número de elementos. Isso só funciona com
> arrays, olha:
>
> my $count = @animals; # Apenas funciona com arrays
> Se você tentar a mesma coisa com uma lista, você vai pegar um
> resultado diferente, embora pareça que você tem uma lista do lado
> direito, o Perl vê um monte de scalares separados por vírgulas:
>
> my $scalar = ( 'dog', 'cat', 'bird' ); # $scalar pega o "bird"
>
> Quando se atribui uma lista para um scalar, o lado direito está no
> contexto scalar. O operador vírgula(Sim, é um operador!) em contexto
> scalar avalia o lado esquerdo. Jogando fora o resultado, e avaliando o
> lado direito retornando o resultado. Em efeito, esse "list-lookalike"
> retorna o elemento mais a direita. Muitas pessoas confundem essa
> bagunça quando escolhem um "list-lookalike" cujo elemento é o que eles
> esperam contar:
>
> my $scalar = ( 1, 2, 3 ); # $scalar vale 3
>
> ------------------------------------------------------------
>
>
> []'s
>
> --
> "If you’ve never written anything thoughtful, then you’ve never had
> any difficult, important, or interesting thoughts. That’s the secret:
> people who don’t write, are people who don’t think."
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>
--
Gabriel Vieira
More information about the SaoPaulo-pm
mailing list