Forum Webscript.Ru

Программирование => Perl => Тема начата: AnnA от 24 Июня 2004, 15:00:35

Название: ошибка в error.log(регулярка)
Отправлено: AnnA от 24 Июня 2004, 15:00:35
доброго времени суток!

Я удивляюсь. Открываю лог, написано:
Use of uninitialized value in substitution (s///) at arc.cgi line 75

смотрим arc.cgi line 75:
$nomer=~s/\\b0(\\d+?)/$1/;
заменяем на:
$nomer=~s/\\b0(\\d+?)/\\1/;

Открываем лог, написано:
arc.cgi: \\1 better written as $1 at arc.cgi line 75.

издевается? ;) получается, что при use strict; разве необходимо объявлять переменные вроде $1, $2... или  например $a и $b для сравнения в сортировке.
Подскажите - чего я делаю не так-то.

спасибо.
Название: ошибка в error.log(регулярка)
Отправлено: Phoinix от 24 Июня 2004, 15:11:51
AnnA

Это не use strict, это use warning. И обозначает собственно, что переменная $nomer - не определена, а $1 здесь не причем...

Исправить можно так:
$nomer =~s /\\b0(\\d+?)/$1/ if $nomer;
Название: ошибка в error.log(регулярка)
Отправлено: AnnA от 24 Июня 2004, 15:18:19
нет. если бы она была не определена - скрипт вообще бы не работал:
Global symbol "$nomer" requires explicit package name at arc.cgi line 75.

#!/usr/bin/perl -w

use strict;
use vars qw(среди прочего есть и $nomer);
......
а в случае с Вашим вариантом кода тоже самое:
Use of uninitialized value in substitution (s///) at arc.cgi line 75
Т.е. насколько я поняла - от этой записи в логе можно избавиться лишь включив $1 в список use vars qw(среди прочего есть и $nomer);
нонсенс. :(
Название: ошибка в error.log(регулярка)
Отправлено: ondr от 24 Июня 2004, 15:23:06
Нет, не издевается. Всё верно, следуй советам.
Ни $1,$2... ни $a,$b(в сортировке) объявлять не надо.
Убедится, что они инициализированы(иными словами не undef) не лишнее. Это можно сделать как в регулярке, так и при сортировке.
Впрочем, можно и блокировать вывод предупреждений в некоторых моментах. Но тут решать только тебе.
Название: ошибка в error.log(регулярка)
Отправлено: Phoinix от 24 Июня 2004, 15:30:01
AnnA

#!/usr/bin/perl -w - use warning

Цитировать
Use of uninitialized value in substitution (s///) at arc.cgi line 75


Предупреждение, о том, что регулярное выражение применяется к неопределенной переменной, неопределена, не значит не объявлена, а значит пустая, undef...
Просто при использовании регулярных выражений, сначала проверь переменную...
Название: ошибка в error.log(регулярка)
Отправлено: AnnA от 24 Июня 2004, 15:30:26
погодите-ка, добрый человек.
Цитировать
ondr:
Убедится, что они инициализированы(иными словами не undef) не лишнее. Это можно сделать как в регулярке, так и при сортировке.

все же переписать так: use vars qw(среди прочего есть и $nomer $1);
или перед line 75 написать my $1;
Цитировать
ondr:
Впрочем, можно и блокировать вывод предупреждений в некоторых моментах.
нет. мне такое не подходит: я ведь должна быть в курсе того, что там происходит. ;)
Название: ошибка в error.log(регулярка)
Отправлено: AnnA от 24 Июня 2004, 15:31:24
попробовала и так и так. ошибки в логе нет. но... как-то это неправильно.
Название: ошибка в error.log(регулярка)
Отправлено: Phoinix от 24 Июня 2004, 15:38:04
AnnA
Не определена - это значит не имеет значения, = undef.

код:

#!/usr/bin/perl -w
use strict;
my $var;
if ($var eq \'value\') {print \'OK\'}
else {print \'NO\'}

Выдаст \'NO\', но при этом предупредит, что переменная не определена, а код:


#!/usr/bin/perl -w
use strict;
my $var;
if ($var && $var eq \'value\') {print \'OK\'}
else {print \'NO\'}

Сдалает то же самое, но предупреждения не выдаст...
Название: ошибка в error.log(регулярка)
Отправлено: ondr от 24 Июня 2004, 15:42:07
AnnA
my(), local(), use vars qw() объявляют переменную, но с присвоением ей значения они никак не связанны. В данном, конкретном случае они не требуются.
Название: ошибка в error.log(регулярка)
Отправлено: AnnA от 24 Июня 2004, 15:52:04
Phoinix, ondr спасибочки :chmok:
вот уж разложили все по полочкам. :appl:
... но я так ничего и непоняла... ;) шутка.
написала так: $nomer=~s/\\b0(\\d+?)/$1/ if $1;
и в логе тишина. :)
люблю этот форум за то, что отвечают оперативно и по делу.
Название: ошибка в error.log(регулярка)
Отправлено: ondr от 24 Июня 2004, 16:19:26
Цитировать
и в логе тишина

И на экране тоже :)

ps: Условный переход обрабатывается раньше чем действие на это условие. Соответствено содержимое сис. переменной $1 в данной проверке никак не связано с действиями в данной регулярке ;)