Почему мой Perl-скрипт жалуется на «Глобальный символ« $ connection »требует явного имени пакета»? - PullRequest
3 голосов
/ 25 марта 2009
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;

Выше код умирает с:

Global symbol "$connection" requires explicit package name

Редактировать Этот вопрос относится к:

Надеюсь, оригинальный постер сможет убрать это, так что это имеет больше смысла, но вот что у нас есть, поэтому мы можем попытаться помочь.

Ответы [ 3 ]

3 голосов
/ 25 марта 2009

Хотя ответ Кента обдумывается заранее, ошибка просто говорит вам, что вы не объявили $connection как лексическую ("мою") переменную. Таким образом, Perl интерпретирует это как то, что вы должны ссылаться на глобальный пакет.

Raw Perl не жалуется, когда вы используете неопределенную переменную, он считает его глобальным пакетом. Кажется, у вас где-то есть strict (стандартная и рекомендуемая практика), которая требует, чтобы вы объявили свои переменные перед их использованием. Если вы не объявили переменную в текущем пакете (или «пространстве имен»), она предполагает, что вы ссылаетесь на переменную, объявленную в другом пакете, поэтому она попросит вас добавить имя пакета, просто чтобы все было ясно и наглядно ,

Perl использует my для объявления переменных области и our для объявления глобальных переменных пакета.

my $connection = "Rainbow";

OR

our $connection = 'French';

<ч /> На случай, если вы ошиблись, сообщение об ошибке исчезнет, ​​если вы выключите его, ваша проблема не исчезнет. И они могут уйти в подполье.

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

Perl просто не будет жаловаться , что $nothing - ничто. И эта легко исправляемая ошибка может вызвать более тонкие ошибки в других местах. Кроме того, подумайте, если вы успешно присвоили $connection, введите только:

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

Perl дает вам сообщение о '$connecion' и, надеюсь, вы можете сказать, что это была опечатка, и, по крайней мере, 30 минут не замечать ее и задаться вопросом, является ли ваш запрос неправильным или что-то еще.

1 голос
/ 25 марта 2009

Re:

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

Если вы собираетесь использовать & при вызовах функций, убедитесь, что вы также используете скобки:

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

В противном случае параметры выполняемого в настоящий момент подпрограммы становятся доступными (и изменяются) вызываемой вами подпрограммой.

Это означает, что если вы используете свой скрипт cgi в mod_perl, вы вдруг делаете

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

, что может быть очень неправильно, если GetDate принимает необязательный аргумент.

1 голос
/ 25 марта 2009

Хорошо, если это связанный контент для этого другого вопроса,

Причина, по которой это происходит с ошибкой, заключается в том, что вы закомментировали строку, которая создает переменную соединения.

Как вы собираетесь запрашивать в базе данных строку таблицы, если у вас не определено соединение с базой данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...