Como devo usar a palavra-chave “my” em Perl?

90

Continuo vendo a palavra-chave "my" na frente dos nomes das variáveis ​​em scripts Perl de exemplo online, mas não tenho ideia do que significa. Tentei ler as páginas do manual e outros sites online, mas estou tendo dificuldade em discernir para que serve, dada a diferença entre como vejo que é usado e o manual.

Por exemplo, é usado para obter o comprimento da matriz neste post: Encontre o tamanho de uma matriz em Perl

Mas o manual diz:

Um my declara que as variáveis ​​listadas são locais (lexicamente) para o bloco, arquivo ou eval que o inclui. Se mais de um valor for listado, a lista deve ser colocada entre parênteses.

O que ele faz e como é usado?

FistOfFury
fonte
3
Re "é usado para obter o comprimento da matriz neste post", de jeito nenhum. mynão foi levado em consideração no mínimo. É o operador de atribuição escalar ( =) que reforça o contexto escalar @arr.
ikegami
Se não for realmente "seu", você não deve usá-lo.
icenac

Respostas:

139

myrestringe o escopo de uma variável. O escopo de uma variável é onde ela pode ser vista. Reduzir o escopo de uma variável para onde ela é necessária é um aspecto fundamental de uma boa programação. Isso torna o código mais legível e menos sujeito a erros, e resulta em uma série de benefícios derivados.

Se você não declarar uma variável usando my, uma variável global será criada. Isso deve ser evitado. Usar use strict;diz ao Perl que você deseja ser impedido de criar variáveis ​​globais implicitamente, e é por isso que você deve sempre usar use strict;(e use warnings;) em seus programas.


Leitura relacionada: Por que usar use strict;e use warnings;?

ikegami
fonte
10
Finalmente uma resposta que explica por quê .
ThisSuitIsBlackNot
Para pessoas que vêm de JS: É essencialmente como vare letem JavaScript. Sem 'use strict';JS permitirá que você declare novas variáveis ​​globais sem nenhuma palavra-chave, o que não é considerado a melhor prática.
Café Elétrico
@Electric Café, termos em JS, a pergunta seria "O que lete varfazem e como eles devem ser usados?" E sim, a resposta seria praticamente a mesma. (Vars de JS letsão muito parecidos com myvars de Perl , exceto que letvars não podem ser capturados.)
ikegami
Só quis dizer que, se as pessoas viessem do JS para o Perl, seria uma maneira fácil de explicar o mesmo conceito
Electric Coffee
@ElectricCoffee 1) Um programador que entende o escopo não precisa que ele seja explicado novamente após trocar de idioma. 2) Não tenho certeza se você realmente explicou o escopo, em termos que um programador JS entenderia ou não. Talvez você estivesse tentando explicar use strict;? Mas essa não era a questão e use strict;faz mais do que isso. Ou talvez você quisesse comunicar que mylimita o escopo de vars como lete varfaz, mas essa é basicamente a primeira frase da resposta. 3) Se você deseja responder a uma pergunta de forma diferente, é para isso que serve o Answers.
ikegami
27

Resumo rápido: mycria uma nova variável, localaltera temporariamente o valor de uma variável

No exemplo abaixo, $ :: a refere-se a $ a no namespace 'global'.

$a = 3.14159;
{
  my $a = 3;
  print "In block, \$a = $a\n";
  print "In block, \$::a = $::a\n";
}
print "Outside block, \$a = $a\n";
print "Outside block, \$::a = $::a\n";

# This outputs
In block, $a = 3
In block, $::a = 3.14159
Outside block, $a = 3.14159
Outside block, $::a = 3.14159

ou seja, localaltera temporariamente o valor da variável, mas apenas dentro do escopo em que ela existe.

Fonte: http://www.perlmonks.org/?node_id=94007

Atualizar

Sobre a diferença entre oure myconsulte

(Graças a ThisSuitIsBlackNot ).

Igor Chubin
fonte
Importa-se de explicar 'deles'? Sempre achei isso confuso.
rdodev
@rdodev: O que você quer dizer?
Igor Chubin
Eu continuo vendo código perl tanto com 'meu' quanto com 'deles' e nunca entendi bem a diferença, na prática.
rdodev
@rdodev: você poderia me enviar um link para algum código com their?
Igor Chubin
3
@rdodev, acho que você quer dizer our: stackoverflow.com/questions/845060/…
ThisSuitIsBlackNot
4

Variáveis ​​privadas via my () é a documentação principal para my.

No exemplo do tamanho do array que você mencionou, não é usado para encontrar o tamanho do array. É usado para criar uma nova variável para manter o tamanho do array.

cjm
fonte