[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