2009-03-25 7 views
3
my $now = &GetDate; 
my $myHeader = &ReadMessage; 
my $mySoftwareVersions = param('mySoftwareVersions'); 
my $q = new CGI;print $q->header(); 

use CGI::Carp(fatalsToBrowser); 
getAllSoftwareVersions(); 

sub getAllSoftwareVersions 
{ 
     my $user = "zxxx"; 
     my $passwd = "xxxx"; 
#  my $tableName = "config_table"; 
#  my $connection = DBI->connect("DBI:mysql:MESCI:hamysql02.stl.mo.boeing.com:18080", $user, $passwd, { AutoCommit => 0, RaiseError => 1}) or die "Couldn't connect to Database: " . DBI->errstr; 
     print "Must be connected\n\n"; 
     print "\n\n"; 
# Error here. 
     my @Rows = &getConfigTableRows($connection, $config_table, $mySoftwareVersions); 
     my $total = @Rows; 
     print "total is "; 
     print $total; 

Le code ci-dessus meurt avec:

Global symbol "$connection" requires explicit package name

Modifier Cette question est liée à:

Espérons que l'affiche originale sera en mesure de nettoyer cela, donc c'est plus logique, mais voici ce que nous avons jusqu'ici afin que nous puissions essayer d'aider.

+0

C'est beaucoup mieux, mais cela va être encore confus pour les personnes qui ne connaissent pas les autres questions que vous avez postées. S'il vous plaît essayez de ne pas poser 3 questions pour une question, utilisez simplement le lien "Modifier" en bas pour le rendre progressivement meilleur. –

+0

Aussi, vous pouvez lire ceci, Il existe pour essayer de vous empêcher de tomber dans les pièges courants que la communauté réagit mal à: http://stackoverflow.com/questions/469150/im-new-to-stackoverflow-what-should -i-considère-avant-pose-des-questions –

+0

Sortie XML? Quelle sortie XML? – innaM

Répondre

1

Eh bien, si tel est le contenu lié à cette autre question,

La raison pour laquelle cela est erroring est parce que vous avez commenté la ligne qui crée la variable de connexion.

Comment allez-vous interroger la base de données pour une ligne de table lorsque la connexion à la base de données n'est pas définie?

3

Bien que la réponse de Kent pense à l'avenir, l'erreur est tout simplement vous dire que vous ne l'avez pas $connection déclare comme une variable lexicale (« mon »). Donc, perl l'interprète comme si vous deviez faire référence à un paquet global.

Raw Perl ne se plaint pas lorsque vous utilisez une variable indéfinie, il considère qu'il s'agit d'un package global. Vous semblez avoir strict quelque part (une pratique standard et recommandée), qui vous demande de déclarer vos variables avant de les utiliser. Si vous n'avez pas déclaré la variable dans le package courant (ou "namespace"), il suppose que vous faites référence à une variable déclarée dans un autre paquet, donc il vous demande d'ajouter le nom du paquet, juste pour garder tout clair et dessus .

Perl utilise my pour déclarer des variables étendues et our pour déclarer des globales de package.

my $connection = "Rainbow"; 

OU

our $connection = 'French'; 


Juste au cas où vous avez une mauvaise idée, le message d'erreur disparaîtrait si vous avez activé stricte au large, votre problème ne serait pas. Et ils pourraient aller sous terre.

{ no strict; 
    my @rows = getConfigTableRows($nothing, @other_stuff); 
} 

Perl tout simplement pas se plaindre que $nothing est rien. Et cette erreur facile à corriger peut entraîner des erreurs plus subtiles dans d'autres endroits. De plus pense que si vous aviez attribué $connection avec succès, seul type:

{ no strict; 
    my @rows = getConfigTableRows($connecion, $config_table, $mySoftwareVersions); 
} 

Perl vous donne un message sur '$connecion' et nous l'espérons, vous pouvez dire que ce fut une faute de frappe, et renoncez au moins 30 minutes ne pas le voir et je me demandais si votre requête est fausse, ou peu importe.

+0

Essayez de reformuler cela, vous donnez l'impression que «strict» est une mauvaise chose. –

+1

J'explique l'inférence, je n'approuve rien. Cela aide à comprendre pourquoi Perl n'échoue pas avec l'erreur "Undeclared variable" - parce que dans le surensemble de perl, les variables non déclarées ne sont pas une erreur de compilation; ils ont simplement une certaine inférence. – Axeman

+0

oui, mais encore, le libellé ne transmet pas cela. Instinctivement la façon dont son libellé insinue "oh, éteignez juste strict". Je sais que ce n'est pas * intentionnel * mais c'est comme ça que ça se lit. –

1

Re:

my $now = &GetDate; 
my $myHeader = &ReadMessage; 

Si vous allez utiliser & sur vos appels de fonction, assurez-vous utiliser des parenthèses aussi:

my $now = &GetDate(); 
my $myHeader = &ReadMessage(); 

Dans le cas contraire, les paramètres de l'en cours d'exécution sous sont mis à la disposition (et modifiable par) le sous-programme que vous appelez.

Cela signifie que si vous utilisez votre script cgi mod_perl, vous êtes soudainement en effet fait

my $now = &GetDate(Apache2::RequestUtil->request); 

qui est susceptible d'être très mal si GetDate prend un argument optionnel.

Questions connexes