[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