O melhor tutorial Perl sub-rotina (função) em 2024. Neste tutorial você pode aprender Passando parâmetros para sub-rotinas,Hash passado para uma subrotina,valor de retorno sub-rotina,variáveis privadas de sub-rotinas,variáveis atribuição temporária,variáveis estáticas,contexto de chamada sub-rotina,
Perl sub-rotina que é função definida pelo usuário.
Perl sub-rotina que é um pedaço de código para realizar a separação tarefas especiais, ele pode fazer para reduzir a duplicação de código e fazer o programa fácil de ler.
Perl sub-rotina pode aparecer em qualquer lugar no programa, a sintaxe é a seguinte:
sub subroutine{ statements; }
Sub-rotina sintaxe de chamada:
subroutine( 参数列表 );
Perl 5.0 na seguinte chamada sub-rotina versões da seguinte forma:
&subroutine( 参数列表 );
Na nova versão, embora ele suporta o método de chamada, mas não é recomendado.
Em seguida olhamos para um exemplo simples:
#!/usr/bin/perl # 函数定义 sub Hello{ print "Hello, World!\n"; } # 函数调用 Hello();
O programa acima, a saída é:
Hello, World!
Perl sub-rotina pode aceitar vários parâmetros e outra programação, usar a matriz parâmetros especiais @_ sub-rotina indicada.
Deste modo, a sub-rotina primeiro argumento é $ _ [0], o segundo argumento é _ $ [1], e assim por diante.
Se os parâmetros são do tipo escalar ou matriz, o usuário do parâmetro passado para a sub-rotina, perl padrão pela referência chamá-los.
#!/usr/bin/perl # 定义求平均值函数 sub Average{ # 获取所有传入的参数 $n = scalar(@_); $sum = 0; foreach $item (@_){ $sum += $item; } $average = $sum / $n; print '传入的参数为 : ',"@_\n"; # 打印整个数组 print "第一个参数值为 : $_[0]\n"; # 打印第一个参数 print "传入参数的平均值为 : $average\n"; # 打印平均值 } # 调用函数 Average(10, 20, 30);
O programa acima, a saída é:
传入的参数为 : 10 20 30 第一个参数值为 : 10 传入参数的平均值为 : 20
O usuário pode alterar o valor dos parâmetros reais correspondentes, alterando os valores na matriz @_.
Desde @_ variável é um array, para que ele possa passar a lista para a sub-rotina.
Mas se precisamos passar um escalar e matriz parâmetros, você precisa listar no último parâmetro, da seguinte forma:
#!/usr/bin/perl # 定义函数 sub PrintList{ my @list = @_; print "列表为 : @list\n"; } $a = 10; @b = (1, 2, 3, 4); # 列表参数 PrintList($a, @b);
O programa acima irá fundir o escalar e uma matriz de resultados de saída:
列表为 : 10 1 2 3 4
Nós podemos passar para subprogramas várias matrizes e hashes, mas se ele é passado várias matrizes e hashes, levará à perda de uma identidade independente. Então, precisamos usar a referência (a próxima seção irá introduzir) para passar.
Quando a tabela hash é passado para a sub-rotina, ele será copiado para @_ na tabela hash será para expandir a lista de pares de chave / valor.
#!/usr/bin/perl # 方法定义 sub PrintHash{ my (%hash) = @_; foreach my $key ( keys %hash ){ my $value = $hash{$key}; print "$key : $value\n"; } } %hash = ('name' => 'w3big', 'age' => 3); # 传递哈希 PrintHash(%hash);
A saída de execução de programa acima é:
age : 3 name : w3big
Uma sub-rotina pode ser como outras linguagens de programação usar a instrução return para retornar valores.
Se nenhuma instrução de retorno, então a última linha da demonstração de sub-rotina como o valor de retorno.
#!/usr/bin/perl # 方法定义 sub add_a_b{ # 不使用 return $_[0]+$_[1]; # 使用 return # return $_[0]+$_[1]; } print add_a_b(1, 2)
A saída de execução de programa acima é:
3
Sub-rotina podemos voltar escalares, matrizes e hashes, mas, em contrapartida várias matrizes e hashes, levará à perda de uma identidade independente. Então, precisamos usar a referência (a próxima seção irá introduzir) para retornar vários matrizes e funções.
Por padrão, Perl, todas as variáveis são variáveis globais, o que significa que a variável pode ser chamado de qualquer lugar do programa.
Se precisamos definir variáveis privadas, useo meu operador para definir.
meu operador cria variáveis escopo léxico, variáveis criados com o meulugar sobrevivência no início da instrução até o final do escopo de fechamento.
Âmbito refere-se ao fecho pode estar na região cintas par pode ser um ficheiro, também pode ser um que, quando, para, foreach cadeia EVAL.
O exemplo a seguir demonstra como declarar uma ou mais variáveis privadas:
sub somefunc { my $variable; # $variable 在方法 somefunc() 外不可见 my ($another, @an_array, %a_hash); # 同时声明多个变量 }
#!/usr/bin/perl # 全局变量 $string = "Hello, World!"; # 函数定义 sub PrintHello{ # PrintHello 函数的私有变量 my $string; $string = "Hello, w3big!"; print "函数内字符串:$string\n"; } # 调用函数 PrintHello(); print "函数外字符串:$string\n";
A saída de execução de programa acima é:
函数内字符串:Hello, w3big! 函数外字符串:Hello, World!
Podemos usar os valores temporários locais para variáveis globais, o alcance do valor original após a saída também está de volta.
variáveis locais definidas no programa principal não existe, mas existe na sub-rotina e a chamada sub-rotina sub-rotina. Quando você define podem dar-lhe um valor, tais como:
#!/usr/bin/perl # 全局变量 $string = "Hello, World!"; sub Printw3big{ # PrintHello 函数私有变量 local $string; $string = "Hello, w3big!"; # 子程序调用的子程序 PrintMe(); print "Printw3big 函数内字符串值:$string\n"; } sub PrintMe{ print "PrintMe 函数内字符串值:$string\n"; } sub PrintHello{ print "PrintHello 函数内字符串值:$string\n"; } # 函数调用 Printw3big(); PrintHello(); print "函数外部字符串值:$string\n";
A saída de execução de programa acima é:
PrintMe 函数内字符串值:Hello, w3big! Printw3big 函数内字符串值:Hello, w3big! PrintHello 函数内字符串值:Hello, World! 函数外部字符串值:Hello, World!
função de operadores de estado é semelhante ao modificador static do C, palavras-chave de estado se tornará variáveis locais persistentes.
variáveis de estado também lexicais, apenas a definição do domínio variável lexical é válido, por exemplo:
#!/usr/bin/perl use feature 'state'; sub PrintCount{ state $count = 0; # 初始化变量 print "counter 值为:$count\n"; $count++; } for (1pt5){ PrintCount(); }
A saída de execução de programa acima é:
counter 值为:0 counter 值为:1 counter 值为:2 counter 值为:3 counter 值为:4
Nota 1: Estado só pode criar um variáveis fechadas com escopo dentro da sub-rotina.
Nota 2: estado é introduzida a partir de Perl 5.9.4, deve ser adicionado antes do uso para usar.
Nota 3: Estado pode declarar escalar, array, hash. Mas quando declarar arrays e hashes, você não pode inicializar-lo (pelo menos Perl 5.14 não é suportado).
chamadas de sub-rotina, ele irá retornar para os valores de tipos diferentes, dependendo do contexto, tais como o seguinte localtime () sub-rotina em contexto escalar retorna a string em contexto de lista retorna uma lista:
#!/usr/bin/perl # 标量上下文 my $datestring = localtime( time ); print $datestring; print "\n"; # 列表上下文 ($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time); printf("%d-%d-%d %d:%d:%d",$year+1990,$mon+1,$mday,$hour,$min,$sec); print "\n";
A saída de execução de programa acima é:
Sun Jun 12 15:58:09 2016 2106-6-12 15:58:9