As sub-rotinas Perl também são funções definidas pelo usuário.
Uma sub-rotina Perl é um trecho de código separado que executa uma tarefa específica, o que pode reduzir o código repetitivo e tornar o programa mais fácil de ler.
As sub-rotinas Perl podem aparecer em qualquer lugar do programa e o formato da sintaxe é o seguinte:
sub subrotina{ instruções;}
Formato de sintaxe para chamar a sub-rotina:
subrotina(lista de parâmetros);
Nas versões anteriores ao Perl 5.0, o método de chamada de uma sub-rotina é o seguinte:
&subrotina(lista de parâmetros);
Na nova versão, embora este método de chamada também seja suportado, seu uso não é recomendado.
A seguir, vejamos um exemplo simples:
Executando o programa acima, o resultado de saída é:
Olá, mundo!
Os subprogramas Perl podem aceitar vários parâmetros como outros parâmetros de programação são marcados com o array especial @_.
Portanto, o primeiro parâmetro da sub-rotina é $_[0], o segundo parâmetro é $_[1] e assim por diante.
Independentemente de os parâmetros serem escalares ou array, quando o usuário passa os parâmetros para a sub-rotina, o Perl os chama por referência por padrão.
Executando o programa acima, o resultado de saída é:
Os parâmetros passados são: 10 20 30 O valor do primeiro parâmetro é: 10 O valor médio dos parâmetros passados é: 20
Os usuários podem alterar o valor do parâmetro real correspondente alterando o valor na matriz @_.
Como a variável @_ é um array, uma lista pode ser passada para ela na sub-rotina.
Mas se precisarmos passar parâmetros escalares e de array, precisamos colocar a lista no último parâmetro, conforme mostrado abaixo:
O programa acima combina escalares e arrays, e a saída é:
A lista é: 10 1 2 3 4
Podemos passar vários arrays e hashes para a sub-rotina, mas ao passar vários arrays e hashes, identidades independentes serão perdidas. Portanto, precisamos usar referências (serão apresentadas no próximo capítulo) para passar.
Quando uma tabela hash é passada para a sub-rotina, ela é copiada para @_ e a tabela hash é expandida em uma lista de combinações de chave/valor.
O resultado de saída da execução do programa acima é:
idade: 3nome: codercto
As sub-rotinas podem retornar valores de função usando a instrução return, assim como em outras linguagens de programação.
Se uma instrução return não for usada, a última linha da sub-rotina será usada como valor de retorno.
O resultado de saída da execução do programa acima é:
3
Podemos retornar escalares, arrays e hashes em sub-rotinas, mas ao retornar múltiplos arrays e hashes, identidades independentes serão perdidas. Portanto, precisamos usar referências (introduzidas no próximo capítulo) para retornar múltiplos arrays e funções.
Por padrão, todas as variáveis em Perl são variáveis globais, o que significa que as variáveis podem ser chamadas em qualquer lugar do programa.
Se precisarmos definir uma variável privada, podemos usar o operador my para defini-la.
O operador my é usado para criar variáveis com escopo lexical. As variáveis criadas por my sobrevivem desde o início da declaração até o final do escopo fechado.
O escopo fechado refere-se à área dentro de um par de chaves, um arquivo ou uma string if, while, for, foreach ou eval.
O exemplo a seguir demonstra como declarar uma ou mais variáveis privadas:
sub somefunc { my $variable; # $variable não é visível fora do método somefunc() my ($another, @an_array, %a_hash);
O resultado de saída da execução do programa acima é:
String dentro da função: Hello, Codercto! String fora da função: Hello, World!
Podemos usar local para fornecer valores temporários para variáveis globais e retornar os valores originais após sair do escopo.
As variáveis definidas por local não existem no programa principal, mas existem no subprograma e nos subprogramas chamados pelo subprograma. Você pode atribuir um valor a ele ao defini-lo, como:
O resultado de saída da execução do programa acima é:
Valor da string dentro da função PrintMe: Hello, Codercto!PrintCodercto Valor da string dentro da função: Hello, Codercto!PrintHello Valor da string dentro da função: Hello, World! Valor da string fora da função: Hello, World!
A função do operador de estado é semelhante ao modificador estático em C. A palavra-chave state torna as variáveis locais persistentes.
state também é uma variável lexical, portanto só é válida no escopo lexical em que a variável está definida.
O resultado de saída da execução do programa acima é:
O valor do contador é: 0 contador O valor é: 1 contador O valor é: 2 contador O valor é: 3 contador O valor é: 4
Nota 1: o estado só pode criar variáveis cujo escopo fechado esteja dentro da sub-rotina.
Nota 2: o estado foi introduzido a partir do Perl 5.9.4, portanto use deve ser adicionado antes do uso.
Nota 3: o estado pode declarar escalares, arrays e hashes. Mas arrays e hashes não podem ser inicializados quando são declarados (pelo menos não em Perl 5.14).
Durante o processo de chamada da sub-rotina, diferentes tipos de valores serão retornados de acordo com o contexto. Por exemplo, a seguinte sub-rotina localtime() retorna uma string em um contexto escalar e uma lista em um contexto de lista:
O resultado de saída da execução do programa acima é:
Domingo, 12 de junho 15:58:09 20162106-6-12 15:58:9