A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

Linguagem Perl - Subrotinas e Funções

Sex

21

Nov

2008


14:29

(3 votos, média 5.00 de 5) 


A linguagem Perl permite a criação de subrotinas, o que, além de facilitar muito o trabalho dos programadores, permite criar um código mais enxuto e mais arrumado. Este tutorial mostra como criar subrotinas.

Subrotinas

Em scripts Perl mais complexos é aconselhável alocar porções específicas do programa em subrotinas definidas para estruturar melhor o script. O mais coerente é separar em subrotinas porções do programa que sejam solicitadas mais de uma vez durante a execução do script. Ao invés de repetir o código cada que vez que este seja necessário, transforme-o numa subrotina e chame-a nos pontos desejados. Veja um exemplo:

#!/usr/bin/perl $Resultado = 1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9; &MostraResultado; $Resultado = sqrt(sqrt(81)); &MostraResultado; sub MostraResultado { print "O resultado é: ", $Resultado, "\n"; }

Uma subrotina é definida pela palavra-chave sub seguida de um nome da sua escolha (mas que siga a convenção de nomes da Perl). No exemplo dado foi definida a subrotina sub MostraResultado. Todo o conteúdo das subrotinas precisa estar contido entre chaves e não há limitação do número de linhas de comando.

Uma subrotina é chamada com o caracter "e comercial" & seguido do nome da subrotina. A chamada é um comando próprio, portanto precisa terminar como todos os outros comandos com um sinal de ponto-e-vírgula. No exemplo encontra-se duas vezes o comando &MostraResultado, que chama a subrotina MostraResultado.

info Observação: Não faz diferença em qual posição se encontra uma subrotina dentro de um script. Durante a interpretação, o interpretador Perl executa sequencialmente todas as linhas de comando que se encontram fora das chaves.

As subrotinas, quando chamadas, são procuradas automaticamente. Uma vez terminadas, a execução do script continua na linha seguinte à linha de onde partiu a chamada.

Subrotinas com parâmetros e valores de retorno

Uma subrotina pode receber parâmetros, pode fornecer uma valor de retorno ou ambos. O exemplo abaixo mostra como enviar um parâmetros e gerar um valor de retorno:

#!/usr/bin/perl $x = &Calcular(1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9); print $x, "\n"; sub Calcular { return eval($_[0]); }

Ao contrário de outras linguagens de programação, como C, Java ou Javascript, a linguagem Perl não exige que os parâmetros sejam declarados para que uma subrotina possa recebê-los. No exemplo acima a subrotina Calcular é chamada com o parâmetro (1 + 2 * 3 + 4 * 5 + 6 * 7 + 8 * 9). A subrotina Calcular processa esse parâmetro com o construtor $_[0]. Por trás deste construtor está uma variável predefinida, a lista _@, que é uma lista dos parâmetros enviados. $_[0] corresponde ao primeiro parâmetro, $_[1] ao segundo e assim por diante. Com uma diretiva como for(_@) { print $_, "\n"; } pode-se, por exemplo, processar todos os parâmetros sem a necessidade de saber quantos são. Esta facilidade dificilmente se encontra em outras linguagens de programação.

A extensa expressão de cálculo que é enviada à subrotina Calcular, na verdade é um único parâmetro. Quando for enviado mais de um parâmetro, estes devem ser separados por vírgulas.

Para que uma subrotina devolva um valor à rotina chamadora, a melhor função a ser utilizada é return, seguida do valor a ser retornado ou de uma variável cujo valor se queira retornar. No exemplo, return devolve um valor que é o resultado de uma função, o valor da função eval(). Esta função processa uma cadeia de caracteres como operação matemática e devolve o resultado calculado.

O valor devolvido pela subrotina Calcular é atribuído à escalar $x. Para que isto ocorra, atribui-se diretamente à escalar $x uma chamada à subrotina Calcular.

Variáveis Locais

Ao contrário da maioria das outras linguagens de programação, em Perl as variáveis definidas em subrotinas continuam válidas após o término da subrotina. Isto significa que não é possível usar o mesmo nome para duas variáveis diferentes no mesmo script. No momento em que se utilizar a variável homônima, o valor da primitiva é alterado - homônima e primitiva são simplesmente a mesma variável. Esta característica acabou levando à fama de que a Perl é uma linguagem com a qual é impossível programar de forma limpa e estruturada. Entretanto, há muito já existe a possibilidade de limitar a sobrevida de uma variável à respectiva subrotina... só não podemos esquecer de fazer isto!

Exemplo 1:

#!/usr/bin/perl &Calcule(3*12); print $x, "\n"; sub Calcule { $x = eval($_[0]); }

Exemplo 2:

#!/usr/bin/perl &Calcule(3*12); print $x, "\n"; sub Calcule { my $x = eval($_[0]); }

No exemplo 1, primeiramente é chamada a subrotina Calcule. Nesta subrotina, a escalar $x é definida e calcula o primeiro parâmetro recebido. É tudo o que essa subrotina realiza. A seguir, na rotina principal, o valor de $x é mostrado. Isto funciona porque $x não perdeu seu valor após o término da subrotina Calcule.

O exemplo 2 diferencia-se do exemplo 1 apenas pelo uso da palavra reservada my (my = meu, minha) colocada antes da definição de $x. Colocando-se a palavra my antes da definição de uma escalar, um array ou um hash, define-se estas variáveis como locais, restritas à subrotina à qual pertencem. No exemplo 2, a escalar $x fica vazia e nada é apresentado como resultado.

Funções Perl

Perl é uma linguagem poderosa porque seu interpretador identifica uma grande variedade de subrotinas - aqui denominadas funções. Existem funções Perl para as tarefas mais variadas. Muitas delas podem ser encontradas em todos os tutoriais Linguagem Perl.

#!/usr/bin/perl print "Digite várias palavras separadas por vírgulas:\n"; $Entrada = ; @Lista = split(/,/, $Entrada); @ListaOrdenada = sort(@Lista); print "Obrigada! Segue a lista das palavras ordenadas alfabeticamente:\n"; for(@ListaOrdenada) { if(/\n/) { chop($_); } print $_, "\n"; }

A primeira função do exemplo acima é print. Geralmente as funções em Perl, assim como em outras linguagens de programação, são chamadas com parênteses (). Os parênteses, porém, nem sempre são obrigatórios. Em funções de uso intensivo, como a função print, os parênteses caíram em desuso. Se, por exemplo, ao invés de escrever sort(@Lista) (que também aparece no exemplo) for escrito sort @Lista, o interpretador Perl executa a função sem problemas.

As funções Perl, em geral, aguardam parâmetros com os quais devem trabalhar. "Digite várias palavras separadas por vírgulas:\n"; é um parâmetro enviado para a função print. Mais abaixo, a função sort recebe como parâmetro a lista de nome $Lista. No caso da passagem de mais de um parâmetro, estes devem ser separados por vírgulas.

A grande maioria das funções Perl tem um valor de retorno. No exemplo acima, a função sort assume a ordenação da lista recebida como parâmetro e retorna uma nova lista com os elementos ordenados.

Duas outras funções existentes no exemplo acima são split e chop. A função split pode procurar caracteres ou uma sequência de caracteres em uma string, a qual é enviada como parâmetro associada a expressões regulares. Split, então, retorna uma lista com os elementos que foram separados de acordo com a regra de segregação especificada pelas expressões regulares.

A função chop elimina o último caractere de uma string. É muito útil, uma vez que as strings, em muitos casos, recebem automaticamente um sinal de quebra de linha (\n) como terminador.

Finalmentes

A lista de funções da linguagem Perl é imensa. Tem função de tudo que é tipo, para as mais diversas tarefas. Sugestão da vó:

Antes de criar uma subrotina, verifique se já não existe uma função pronta que faça o que você precisa. O tempo gasto com a procura não é perda de tempo, pode ter certeza.

Вадим Логофет Sberbankнабор профессиональной косметики для макияжалобановский александр харьковсамый дорогойкупить кисть для консилера недорого харьковтакиtopodin

Informações adicionais