9
votes

Comment vérifier si la variable est déclarée à Perl?

J'utilise Utilisez strict; code> en Perl et avec qui j'utilise l'instruction suivante.

Global symbol "$x" requires explicit package name at *********** in line 15.


2 commentaires

Pourquoi voudriez-vous faire cela? Le code doit être déjà conscient de quelles variables et espaces de noms qu'il dispose - il ne devrait pas y avoir besoin de vérifier.


@ETher Il y a beaucoup de raisons. Il est similaire à #define <> in C. Vous voulez dire filtrer les relevés d'impression de débogage dans votre code


8 Réponses :


19
votes

le strict pragma a trois parties: références strictes, strict variables et sous-marins stricts. Celui que vous rencontrez est

strict vars

Ceci génère une erreur de compilation si vous accédez à une variable qui n'a pas été déclarée via Nos ou utilisent vars , localisé via mon , ou n'a pas été pleinement qualifié. Comme il s'agit d'éviter des problèmes de suicide variable et des problèmes de cadrage dynamiques subtils, une variable locale

Parce qu'il génère des erreurs de temps de compilation, votre code non-code> commencer au code n'a même pas de chance de courir. Vous pouvez autoriser temporairement des variables non strictes à l'intérieur d'un bloc comme dans xxx

mais note que l'opérateur défini par Perl est défini indique si une valeur est définie, non Si une variable a été déclarée.

nous en dire plus sur votre application et nous pouvons vous donner de meilleurs conseils sur la façon de le gérer.


1 commentaires

La partie importante est la distinction entre non déclaré et non définie.



1
votes
 #
 use strict;
 print "Not defined" if !defined($x);

0 commentaires

6
votes

Vous ne pouvez même pas se référer em> à une variable à moins que cela ne soit déclaré. Lorsque vous demandez

my $h = peek_my (0);
exists $h->{x};


0 commentaires

6
votes

Je pense que vous mélangez des concepts "définis" et "déclarés" et "déclara".

Vous demandez "Comment vérifier si la variable est déclarée dans Perl" mais vous vérifiez si une variable est définie. Ce sont deux concepts différents. P>

en Perl si vous utilisez 'user strict' em> Vous vérifiez automatiquement toute variable non déclarée forte> (en utilisant mon strong>, local fort> ou notre strud>). Une fois que vous avez une variable déclarée, vous pouvez tester s'il est défini (avoir une valeur attribuée). P>

Donc, dans votre test, il vous manque une déclaration préalable avant de tester la définition p>

my ($x,$y, $z);
$w;         # not declared (use strict will catch it and die)
$x = 0;     # declared and defined BUT if you make a logic test like 'if ($x) {}' then it will be FALSE, so don't confuse testing for **'$x'** and testing for **'defined $x'**
$y = undef; # declared but not defined
$z = 1;     # declared, defined, and logial test TRUE


0 commentaires

1
votes

Normalement, ce type de code ne doit pas être requis pour un programme sérieux, mais pourquoi non seulement pour le plaisir: (supposant que l'utilisation soit stricte) xxx


0 commentaires

0
votes
#!/usr/bin/perl -l

use strict;

# if string below commented out, prints 'lol' , if the string enabled, prints 'eeeeeeeee'
#my $lol = 'eeeeeeeeeee' ;
# no errors or warnings at any case, despite of 'strict'

our $lol = eval {$lol} || 'lol' ;

print $lol;

0 commentaires

0
votes

Ma solution est #! / usr / bin / perl -l xxx


0 commentaires

-1
votes

Vous pouvez utiliser sauf si code> , comme ceci:

use 'strict';

my $var = 'defined';
unless (defined($var)) {
  print "not defined\n";
}

$var = undef;
unless (defined($var)) {
  print "not defined\n";
}


0 commentaires