Qual é o significado de @_
em Perl?
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:Essa é a maneira que o perlcrítico afirma ser correta .
fonte
perlcritic
, pessoalmente acho que isso é melhor para uma função, mas para um método, é útil parashift
a auto-referência, depois descompacte o@_
array. Isso deixa claro que este é um método E que o método leva certos parâmetrosO primeiro resultado de uma pesquisa por
perl @_
diz o seguinte :Ele também tem uma explicação mais longa e detalhada do mesmo.
fonte
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.
fonte
Você também pode usar shift para variáveis individuais na maioria dos casos:
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.
fonte
Todas as "variáveis especiais" do Perl estão listadas na página de documentação do perlvar .
fonte
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 @_:
Isso irá dividir a string
$str
e definir o array@_
.fonte
@
é 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:Chamada de função
Se você observar o código acima, veja a
foreach $item(@_)
linha ... Aqui passa o parâmetro de entrada.fonte
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...
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:
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.
fonte