Skip to content

Commit

Permalink
+[br] name-used-only-once-possible-typo.tt
Browse files Browse the repository at this point in the history
  • Loading branch information
aramisf committed Feb 21, 2014
1 parent a6ca08c commit 193a1f6
Showing 1 changed file with 175 additions and 0 deletions.
175 changes: 175 additions & 0 deletions sites/br/pages/nome-usado-apenas-uma-vez.tt
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.

0 comments on commit 193a1f6

Please sign in to comment.