Qual é o significado de @_
em Perl?
Respostas:
perldoc perlvar é o primeiro lugar para verificar qualquer informação de variável Perl com nome especial.
Citando:
@_
: Dentro de uma sub-rotina, a matriz@_
contém os parâmetros passados para essa sub-rotina.
Mais detalhes podem ser encontrados em perldoc perlsub (sub-rotinas Perl) vinculadas ao perlvar:
Quaisquer argumentos passados aparecem na matriz
@_
.Portanto, se você chamar uma função com dois argumentos, eles serão armazenados em
$_[0]
e$_[1]
.A matriz
@_
é uma matriz local , mas seus elementos são apelidos para os parâmetros escalares reais . Em particular, se um elemento $ _ [0] for atualizado, o argumento correspondente será atualizado (ou ocorrerá um erro se não for atualizável).Se um argumento for uma matriz ou elemento hash que não existia quando a função foi chamada, esse elemento será criado somente quando (e se) for modificado ou uma referência a ele for feita. (Algumas versões anteriores do Perl criavam o elemento independentemente de o elemento ter sido atribuído ou não.) Atribuir a todo o array @_ remove aquele apelido e não atualiza nenhum argumento.
Normalmente, você expande os parâmetros passados para um sub usando a @_
variável:
sub test{
my ($a, $b, $c) = @_;
...
}
# call the test sub with the parameters
test('alice', 'bob', 'charlie');
Essa é a maneira que o perlcrítico afirma ser correta .
perlcritic
, pessoalmente acho que isso é melhor para uma função, mas para um método, é útil para shift
a auto-referência, depois descompacte o @_
array. Isso deixa claro que este é um método E que o método leva certos parâmetros
O primeiro resultado de uma pesquisa porperl @_
diz o seguinte :
@_ é a lista de parâmetros de entrada para um sub.
Ele também tem uma explicação mais longa e detalhada do mesmo.
A questão era o que @_
significa em Perl. A resposta a essa pergunta é que, na medida em que $_
significa isso em Perl, da @_
mesma forma significa eles .
Ninguém parece ter mencionado esse aspecto crítico de seu significado - tão bem quanto o deles .
Conseqüentemente, eles são usados como pronomes ou, às vezes, como tópicos.
Eles geralmente têm antecedentes nominais, embora nem sempre.
Você também pode usar shift para variáveis individuais na maioria dos casos:
$var1 = shift;
Este é um tópico no qual você deve pesquisar mais, pois o Perl tem várias maneiras interessantes de acessar informações externas dentro de sua rotina secundária.
Além disso, se uma função retorna um array, mas a função é chamada sem atribuir seus dados retornados a qualquer variável como abaixo. Aqui, split () é chamado, mas não é atribuído a nenhuma variável. Podemos acessar seus dados retornados posteriormente através de @_:
$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);
print @_[0]; # 'Mr.Bond'
Isso irá dividir a string $str
e definir o array @_
.
@
é usado para uma matriz.
Em uma sub-rotina ou ao chamar uma função em Perl, pode-se passar a lista de parâmetros. Nesse caso, @_
pode ser usado para passar a lista de parâmetros para a função:
sub Average{
# Get total number of arguments passed.
$n = scalar(@_);
$sum = 0;
foreach $item (@_){
# foreach is like for loop... It will access every
# array element by an iterator
$sum += $item;
}
$average = $sum / $n;
print "Average for the given numbers: $average\n";
}
Average(10, 20, 30);
Se você observar o código acima, veja a foreach $item(@_)
linha ... Aqui passa o parâmetro de entrada.
use strict
. Eu editei sua subfunção, portanto.
Nunca tente editar a variável @_ !!!! Eles não devem ser tocados. Ou você obterá algum efeito inesperado. Por exemplo...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
Antes da chamada, o tamanho sub1 $ contém 1234. Mas depois de 500 (!!) Portanto, não edite este valor !!! Você pode passar dois ou mais valores e alterá-los na sub-rotina e todos eles serão alterados! Nunca vi esse efeito descrito. Os programas que vi também deixam @_ array somente leitura. E só que você pode passar com segurança a variável não mudou a sub-rotina interna. Você deve sempre fazer isso:
sub sub2{
my @m=@_;
....
}
atribua @_ às variáveis de procedimento da sub-rotina local e, em seguida, trabalhe com elas. Além disso, em alguns algoritmos recursivos profundos que returun array, você pode usar essa abordagem para reduzir a memória usada para vars locais. Somente se retornar @_ array o mesmo.