A linguagem de programação Perl possui um conjunto muito rico de ferramentas e estruturas, o que muitas vezes leva-se à possibilidade de escrever um mesmo comando de várias formas diferentes, umas mais simples, outras mais complexas, algumas pouco legíveis mas ao mesmo tempo extremamente concisas.
A maioria dos códigos que se encaixam nessa categoria faz uso de variáveis especiais, que trazem várias facilidades ao mesmo tempo para que pessoas novas na tecnologia gerem uma enorme quantidade de dúvidas. Uma das mais importantes, senão a mais importante dessas variáveis, é a $_ (“dólar-underscore”).
Ela está presente em muitos contextos, mesmo que esses contextos possam utilizar variáveis explicitamente declaradas, e serve principalmente para assumir o valor temporário dentro de alguma estrutura (como uma repetição) ou o argumento de uma condição. Um exemplo que deve clarear um pouco essa idéia:
@vetor = (100, 200, 300);
foreach (@vetor) {
print $_;
}
No exemplo acima, cada iteração da repetição (que percorrerá todos os elementos de vetor) colocará o seu corrente dentro de $_, que será impresso em seguida. Um exemplo ainda mais conciso seria:
@vetor = (100, 200, 300);
foreach (@vetor) {
print;
}
Esse segundo trecho faz exatamente a mesma coisa que o primeiro (imprimir todos os elementos do vetor), só que também utilizou a variável especial _ como argumento, imprimindo o conteúdo nela armazenado na iteração. Nada impede que seja utilizado uma variável explícita na iteração, mas muito código que hoje existe faz uso dessas estruturas, então ter ao menos o conhecimento do seu funcionamento pode facilitar, e muito, numa eventual manutenção de código.
Um outro exemplo de uso dessa variável especial:
# usando variáveis explicitas
while (defined ($linha = <STDIN>)) {
print $linha if $linha =~ /Perl/
}
# usando $_
while(<STDIN>) {
print if /Perl/
}
No primeiro exemplo, a cada iteração nos dados de entrada (que poderiam representar as linhas lidas de um arquivo) os dados são armazenados na variável linha, que em seguida é testada com a existência do termo Perl (usando o operador de expressão regular) e caso retorne verdadeiro (quer dizer, se o termo existir) o conteúdo como um todo é impresso.
Repare agora no segundo exemplo. A variável linha some, dando lugar a $_. Repare que não é necessário nem mesmo colocar a variável como teste do if, ficando tudo sub-entendido. A legibilidade no primeiro bloco até pode ser maior, mas o segundo trecho ganha muito em alto nível, pois muitos detalhes de programação podem ser omitidos.
Esses trechos são apenas exemplos do poder dessa estrutura (e de várias outras que seguem a mesma linha) e que trazem um grande poder ao Perl.