Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с use strict; uninitialized value in concatenation(.) 
V
    Опции темы
zorch
  Дата 21.5.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Привет всем еще раз. 
Есть еще одна маленькая проблема, с котрой сам справится не могу и мне даже не смог помочь один программист Perl из очень известной хонстинг/программинг и т.д. компании (еще один камень в ее огород от меня).
Итак в логах есть ошибка:
Код

Use of uninitialized value in concatenation (.) or string at votedb.pl line 29

Код

#!/usr/bin/perl -w
use strict;
our $table=param('cat');
our $tablecook=$table."_cook";
........
$sth = $dbh->prepare("INSERT INTO $tablecook (`ip`,`key`, `date`, `idnom`) VALUES (\"$ip\", \"$dnsname\", NOW(), \"$id\");"); #29 строка

Как я понимаю я не правильно делаю конкатенцию.... подскажите как правильно ее делать?
$table - название таблицы
$tablecook - название другой таблицы (т.е. если $table ="name", то значение $tablecook должно быть name_cook).
С этим кодом все прекрасно работает, но в логах эта ошибка постоянно.

Это сообщение отредактировал(а) zorch - 21.5.2007, 09:40
PM MAIL   Вверх
Ivan Kolesnikov
Дата 21.5.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

Репутация: нет
Всего: 6



Привет, zorch возможно одна из переменных $ip, $dnsname, $id неинициализируется.

Например:
Код

use warnings;
use strict;

my $aa = "123";
my $bb;

print "ABC $aa XXX $bb YYY";


Возвращает следующее:
Код

Use of uninitialized value in concatenation (.) or string at test.pl line 7.
ABC 123 XXX  YYY


Это на самом деле не ошибка, а предупреждение.

Как решать эту проблему: необходимо всем используемым переменным присваивать явно значения.
--------------------
PM MAIL ICQ   Вверх
amg
Дата 21.5.2007, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



use strict здесь не при чем. Это из-за опции -w. Простейший (но не правильный, пока скрипт до конца не отлажен) способ избавиться от подобной ругани - убрать эту опцию.

Конкатенация делается не только когда между двумя значениями стоит точка, но и когда внутри двойных кавычек находится переменная. Например, "INSERT INTO $tablecook" и 'INSERT INTO '. $tablecook - то же самое. Поэтому проблема, скорее всего, в том, что одна из переменных строки 29 не определена. Чтобы выяснить, какая именно, можно попробовать их всех по-очереди напечатать и посмотреть, где будет ругань.

Добавлено. Я, как обычно, опоздал с ответом. 

Это сообщение отредактировал(а) amg - 21.5.2007, 11:16
PM MAIL   Вверх
zorch
Дата 21.5.2007, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Код

#!/usr/bin/perl -w
use strict;
use lib "/usr/local/psa/lib/perl5/site_perl/5.8.8/mach";
use DBI;
use CGI qw(:standart :cgi);

our $table=param('cat');
our $tablecook=$table."_cook";

our $id=param('nid');
our $data;
our $ip=$ENV{'REMOTE_ADDR'};
our $dnsname=$ENV{'REMOTE_HOST'};
our $title;

our $db_name="****"; 
our $db_login="****";
our $db_pass="*****";


if (auth())
        {
        my $dbh = DBI->connect("DBI:mysql:$db_name", $db_login, $db_pass)|| die $DBI::errstr;
        $dbh->do("SET character_set_client = cp1251");
        $dbh->do("SET character_set_connection = cp1251");
        $dbh->do("SET character_set_results = cp1251");
        my $sth = $dbh->prepare("UPDATE $table SET vote=vote+1 WHERE `id`=$id;");
           $sth->execute();
           $sth = $dbh->prepare("INSERT INTO $tablecook (`ip`,`key`, `date`, `idnom`) VALUES (\"$ip\", \"$dnsname\", NOW(), \"$id\");");
           $sth->execute();



Вроде все переменные определены!
Или я не прав?
PM MAIL   Вверх
amg
Дата 21.5.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



Цитата(zorch @  21.5.2007,  14:20 Найти цитируемый пост)
Вроде все переменные определены!
Не очевидно. По приведенному куску кода можно гарантировать, что определена переменная $tablecook. Остальные вполне могут иметь значение undef. Это же легко проверить!

PM MAIL   Вверх
zorch
Дата 21.5.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



И как это исправить?
PM MAIL   Вверх
amg
Дата 21.5.2007, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



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

defined or $_='' for ($tablecook,$ip,$dnsname,$id);


PM MAIL   Вверх
zorch
Дата 21.5.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Все я разобрался! DNS не определялся, я хотел заняться этим позже... читал о том как исправить, но забыл.
Спасибо! Матчасть рулит! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.