[SP-pm] Qual a diferença entre lista e array ? [Artigo]

Daniel de Oliveira Mantovani daniel.oliveira.mantovani at gmail.com
Sun Mar 14 15:06:08 PDT 2010


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."


More information about the SaoPaulo-pm mailing list