2016-05-19 2 views
1

Pour ce petit code, il imprime toujours les valeurs de @x dans le bloc de code global. Comment émettre un avertissement si je n'initialise pas accidentellement une variable dans un sous-programme sans 'my @x'. Je ne veux pas de variable locale dans le sous-programme comme @x.Problème global local de sous-programme Perl

use strict; 
use warnings; 
my @x=qw/1 2 3/; 

&mysub(); 

sub mysub{ 

    print "@x"; 
} 
+0

Je ne suis pas d'accord avec le vote proche. Ce n'est pas clair. C'est juste impossible, j'ai peur. – simbabque

+0

Perl6 peut le faire, cependant. [This] (https://perl6advent.wordpress.com/2014/12/10/day-10-introspecting-the-symbol-tables/) semble assez soigné. – simbabque

+1

Veuillez ne pas appeler les sous-programmes en utilisant '&'. Ce n'est jamais nécessaire. –

Répondre

6

Avec Perl régulier, vous ne pouvez pas faire cela. La solution est pour ne pas réutiliser les mêmes noms de variables dans des étendues plus petites.


Si vous souhaitez appliquer ce programme, vous pouvez utiliser Perl::Critic. La règle Perl::Critic::Policy::Variables::ProhibitReusedNames vous indique si vous avez réutilisé des noms de variables déjà définis dans une étendue externe.

+0

Je suis d'accord, mais les noms de variables très communs, comme $ t, $ n, $ count, etc. peuvent se glisser accidentellement. Y a-t-il un moyen ou un module pour le vérifier? –

+0

@the voir ma mise à jour. – simbabque

+1

N'utilisez pas de noms de variable à une seule lettre. Prenez l'habitude d'utiliser la portée la plus étroite possible. (Par exemple bloc de code actuel seulement si possible). – Sobrique

0
  1. Organisez mieux votre code. En localisant correctement les variables, il n'y a aucun changement de référence accidentelle à la mauvaise.

  2. Ne pas utiliser de tels noms de variables sans signification.

    Il y a peu de chance d'accéder à @frobs_by_name par accident.