Referências
O conceito de referência é um pouco mais complicado de entender para quem está começando e/ou tem pouca experiência com programação. Uma referência “aponta” para outra variável. A referência contém a localização de outra variável. Nada melhor do que um exemplo para ajudar a entender:
$a = “Oi”;
#Um scalar normal
$b = \$a;
#O $b é uma referência para o $a
O ‘\’ antes de uma variável serve para “extrair” sua referência. Assim:
print $$b;
Mostrará:
Oi
Pode-se analisar como o scalar ($) referenciado por $b. Praticamente qualquer coisa pode ser referenciada: scalares($), arrays(@), hashes(%), filehandles ou mesmo funções(&). Assim:
@array = ( 13, ” carro”, $a);
#Uma array de 3 elementos
$b = \@array;
#$b é uma referência para @array
Assim, @$b é a array(@) referenciada por $b. Cuidado para não usar um tipo de variável diferente da referida pela referência, no caso usar um $ ($$b) ao invés de um @ (@$b). Isso causará um alerta ou mesmo erro na execução do programa.
Pode não parecer óbvio o uso de referências, mas imagine uma array com 1MB de tamanho. Se você simplesmente copiá-la com:
@new_array = @old_array;
Você terá uma cópia idêntica de @old_array.
Se @old_array tem 1MB, @new_array usará outro 1MB. Quando você passa parâmetros para uma função, os parâmetros são copiados para a array @_, a mesma situação ocorre. Se, ao invés de passar parâmetro por parâmetro, for passada uma referência, economiza-se memória e ganha-se velocidade:
@array_gigante = (
#Uma array gigante
funcao(\@array_gigante);
#passa uma referência da array
sub funcao{
$refarray = $_[1];
#Cópia da referência
print @$refarray;
#Usando a array normalmente
print $$refarray[2];
#Ou o terceiro item
}
