Recentemente, enquanto tentava obter um algoritmo para "Obter índices de parênteses correspondentes" , consegui obter o que esse algoritmo significa, embora com alguns problemas com a linguagem perl.
A sintaxe do Perl não é obscura e pode ser melhor compreendida com man perl...
a documentação.
Mas estou um pouco confuso sobre my
o comportamento com for
loop. man perlsyn
diz:
Se a variável for precedida pela palavra-chave "my", então ela é escopo lexical e, portanto, é visível somente dentro do loop. Caso contrário, a variável é implicitamente local para o loop e recupera seu valor anterior ao sair do loop. Se a variável foi declarada anteriormente com "my", ela usa essa variável em vez da global, mas ainda é localizada para o loop. Essa localização implícita ocorre somente para loops que não são do estilo C.
Eu sei que "loops não no estilo C" significa aqueles que não são como for (...;...;...){...}
.
A primeira frase pode ser mostrada por esta, que é semelhante ao exemplo mostrado no documento :
$i = 'samba';
# If the variable is preceded with the keyword "my", then it is lexically scoped, and is therefore visible only within the loop.
for (my $i = 1; $i <= 4; $i++) {
print "$i\n";
}
print "$i\n";
# 1
# 2
# 3
# 4
# samba
Mas não consigo entender o que o 2º significa:
$inner = 'samba';
for ($i = 1; $i <= 4; $i++) {
$inner = $i + 1;
}
print "inner: $inner\n";
# inner: 5
Aqui, a suposta var "local" $inner
parece modificar a var externa, e o "valor antigo" 'samba'
não pode ser "recuperado".
Para o 3º, podemos fazer alguns pequenos ajustes no exemplo acima:
$inner = 'samba';
for ($i = 1; $i <= 4; $i++) {
my $inner = $i + 1;
}
print "inner: $inner\n";
# inner: samba
Isso funciona como esperado para "em vez do global".
Como entender my
o comportamento em for
loop, especialmente para a segunda frase acima na citação?
Esclarecimento de acompanhamento com dicas de resposta de choroba: Ao usar o "non C-style loop" correto, a 1ª e a 2ª frases parecem significar que whether my
é usado para var tem o mesmo efeito. Mas, na verdade, não é esse o caso.
sub foo { print "foo: $x\n"; }
$x = 7;
for $x (1 .. 3) { # Implicit localisation happens here.
print "$x\n";
print "global $::x\n"; # Prints 1 .. 3 correspondingly.
foo(); # Prints 1 .. 3 correspondingly.
}
print $x; # Prints 7.
$x = 7;
for my $x (1 .. 3) { # Implicit localisation happens here.
print "$x\n";
print "global $::x\n"; # Always prints 7.
foo(); # Always prints 7.
}
print $x; # Prints 7.
Essa é apenas a diferença entre local
emy
que significa escopo dinâmico versus escopo lexical, como mostra a resposta principal, o que também é dito no documento .
Um local apenas fornece valores temporários para variáveis globais (ou seja, pacote). Ele não cria uma variável local. Isso é conhecido como escopo dinâmico. O escopo léxico é feito com meu ...
O exemplo da 3ª frase pode ser atualizado:
$i = 'former';
my $i = 'samba';
for $i (1 .. 4) {
print "$i\n";
}
# > still localized to the loop
# i.e. uses the outside variable value but maybe there are more than one choices. The doc says to choose "my $i = 'samba';".
print "$i\n"; # not use 'former'
# 1
# 2
# 3
# 4
# samba
pergunta complementar à resposta de ikegami:
Se acrescentarmos:
my $x = 7;
for $x (1 .. 3) { # Implicit localisation happens here.
print "$x\n";
print "global $::x\n"; # Prints nothing for $::x.
foo(); # Prints nothing for $x.
}
print $x; # Prints 7.
para o sub foo { print "foo: $x\n"; } ...
exemplo acima, então o último $::x
também não pode acessar a última var global definida $x = 7;
. Na minha humilde opinião, my
cria uma nova var que não deve influenciar essa var global.
Mas se definirmos o último var definido como our $x = 7;
que é um "alias léxico para uma variável de pacote (ou seja, global)" como diz o documento. Então tudo funciona como antes. Qual é o motivo para isso?
O estilo não-C é
E funciona conforme documentado:
A documentação não fala sobre outras variáveis não loop. Regras gerais para escopo de variáveis se aplicam a elas.
Além disso, adquira o hábito de usar strict . Isso torna o escopo da variável mais explícito e controlado.
Para localizar uma variável global, use local .
Deixe-me começar dizendo que você sempre deseja,
my
exceto quando usar$_
.Demonstração:
Saída:
Demonstração:
Saída:
Em outras palavras, o código é funcionalmente equivalente ao seguinte:
Saída: