forked from szabgab/perlmaven.com
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
+[br] name-used-only-once-possible-typo.tt
- Loading branch information
Showing
1 changed file
with
175 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
=title Nome "main::x" usado apenas uma vez: possível erro em ... | ||
=timestamp 2013-03-05T20:31:10 | ||
=indexes warnings, strict, possible typo | ||
=status show | ||
=original name-used-only-once-possible-typo | ||
=books beginner_book | ||
=author szabgab | ||
=translator aramisf | ||
=archive 1 | ||
=comments 1 | ||
=social 1 | ||
|
||
=abstract start | ||
|
||
Se você ver este alerta em um script Perl você está com sérios problemas. | ||
|
||
=abstract end | ||
|
||
<h2>Atribuição para uma variável</h2> | ||
|
||
Atribuir algo para uma variável mas nunca usá-la, ou usar uma variável uma | ||
única vez sem jamais atribuir-lhe valor algum, raramente é algo correto de se | ||
fazer em um programa. | ||
|
||
Talvez o único caso "legítimo" é você ter cometido um erro de digitação e | ||
acabou ficando com uma variável que é utilizada somente uma vez. | ||
|
||
Aqui está um exemplo de código onde nós <b>apenas atribuímos a uma variável</b>: | ||
|
||
<code lang="perl"> | ||
use warnings; | ||
|
||
$x = 42; | ||
</code> | ||
|
||
Isto vai gerar um alerta como este: | ||
|
||
<code> | ||
Name "main::x" used only once: possible typo at ... | ||
</code> | ||
|
||
Aquele "main::" e a falta do $ podem estar lhe confundindo. | ||
|
||
Aquele "main::" está lá porque, por padrão, toda variável no Perl está dentro | ||
do escopo (ou em inglês: 'namespace') do "main". Existem também outras coisas | ||
que poderiam ser chamadas de "main::x" e apenas uma delas possui um $ no | ||
início. Se isso lhe parece um pouco confuso, não se preocupe. | ||
|
||
É confuso, mas espero que você não tenha que lidar com isso por um longo | ||
tempo. | ||
|
||
<h2>Buscar apenas o valor</h2> | ||
|
||
Se acontecer de você <b>usar uma variável apenas uma vez</b> | ||
|
||
<code lang="perl"> | ||
use warnings; | ||
|
||
print $x; | ||
</code> | ||
|
||
então você provavelmente vai ter dois alertas: | ||
|
||
<code> | ||
Name "main::x" used only once: possible typo at ... | ||
Use of uninitialized value $x in print at ... | ||
</code> | ||
|
||
Um deles nós estamos discutindo agora, o outro é discutido em | ||
<a href="/uso-de-valor-nao-inicializado">Uso de valor não inicializado</a>. | ||
|
||
|
||
<h2>Qual é o erro aí?</h2> | ||
|
||
Você pode perguntar. | ||
|
||
Só imagine alguém usando uma variável chamada <hl>$l1</hl>. Então, você vem e | ||
tenta usar a mesma variável, mas você escreve <hl>$ll</hl>. | ||
Dependendo da fonte que você usa, ambas podem ser muito parecidas. | ||
|
||
Ou talvez havia uma variável chamada <hl>$color</hl> mas você é Britânico e | ||
automaticamente escreve <hl>colour</hl> quando pensa nela. | ||
|
||
Ou ainda havia uma variável chamada <hl>$numero_de_errros</hl> e você não | ||
percebe o erro no nome original da variável e escreve | ||
<hl>$numero_de_erros</hl>. | ||
|
||
Você já pegou a idéia. | ||
|
||
Se você tiver sorte, você comete esse erro apenas uma vez, mas caso contrário, | ||
se você usar a variável incorreta duas vezes, então este alerta | ||
provavelmente não aparecerá. | ||
Afinal de contas, se você está usando a mesma variável duas vezes, você | ||
provavelmente tem uma boa razão para isso. | ||
|
||
Então como você pode evitar isso? | ||
|
||
Procure evitar variáveis com letras ambíguas e seja bastante cauteloso ao | ||
digitar os nomes de variáveis. | ||
|
||
Se você quiser resolver isso de uma vez por todas, então <b>use strict</b>! | ||
|
||
<h2>use strict</h2> | ||
|
||
Como você pode ver nos exemplos acima, eu não usei o strict. Se eu estivesse | ||
usando-o, então ao invés de receber um alerta sobre um possível erro de | ||
digitação, eu receberia um alerta de erro em tempo de compilação: | ||
<a href="/simbolo-global-requer-nome-de-pacote-explicito">Símbolo global | ||
requer nome de pacote explícito</a>. | ||
|
||
Isso aconteceria mesmo se você usasse o nome incorreto de variável mais de uma vez. | ||
|
||
Então, é claro que existem pessoas que imediatamente escreveriam "my" na | ||
frente da variável incorreta, mas você não é uma dessas pessoas, é? Você | ||
pensaria no problema e procuraria até encontrar o nome da verdadeira variável. | ||
|
||
A forma mais comum de ver esse alerta é se você não estiver usando o | ||
<b>strict</b>. | ||
|
||
Então você está em sérios apuros. | ||
|
||
<h2>Outros casos usando o strict</h2> | ||
|
||
Como os comentaristas GlitchMr e Anonymous apontaram, existem alguns outros | ||
casos: | ||
|
||
Este código, também gera o alerta | ||
|
||
<code lang="perl"> | ||
use strict; | ||
use warnings; | ||
|
||
$main::x = 23; | ||
</code> | ||
|
||
O alerta é: <b>Name "main::x" used only once: possible typo ...</b> | ||
|
||
Aqui ao menos está claro de onde aquele 'main' é proveniente, ou no próximo | ||
exemplo, de onde o Mister vem. | ||
(dica: 'main' e 'Mister' são ambos nomes de pacotes. Se você estiver | ||
interessado, você pode ver outra <a | ||
href="/simbolo-global-requer-nome-de-pacote-explicito">mensagem de erro, | ||
envolvendo nomes de pacotes perdidos</a>.) | ||
No próximo exemplo, o nome do pacote é 'Mister'. | ||
|
||
<code lang="perl"> | ||
use strict; | ||
use warnings; | ||
|
||
$Mister::x = 23; | ||
</code> | ||
|
||
O alerta é <b>Name "Mister::x" used only once: possible typo ...</b>. | ||
|
||
O exemplo a seguir também gera o aviso. Duas vezes: | ||
|
||
<code lang="perl"> | ||
use strict; | ||
use warnings; | ||
|
||
use List::Util qw/reduce/; | ||
print reduce { $a * $b } 1..6; | ||
</code> | ||
|
||
<code> | ||
Name "main::a" used only once: possible typo at ... | ||
Name "main::b" used only once: possible typo at ... | ||
</code> | ||
|
||
Isso acontece porque <hl>$a</hl> e <hl>b</hl> são variáveis especiais usadas | ||
na função <b>sort</b> do Perl, então você não precisa declara-las, mas você as | ||
está usando apenas uma vez neste código. | ||
(Na verdade não é claro para mim porque isto gera os alertas, enquanto o mesmo | ||
código usando o <b>sort</b> não o faz, mas os <a | ||
href="http://www.perlmonks.org/?node_id=1021888">Perl Monks</a> talvez saibam. |