Forum Webscript.Ru
Программирование => Perl => Тема начата: 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 для сравнения в сортировке.
Подскажите - чего я делаю не так-то.
спасибо.
-
AnnA
Это не use strict, это use warning. И обозначает собственно, что переменная $nomer - не определена, а $1 здесь не причем...
Исправить можно так:
$nomer =~s /\\b0(\\d+?)/$1/ if $nomer;
-
нет. если бы она была не определена - скрипт вообще бы не работал:
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);
нонсенс. :(
-
Нет, не издевается. Всё верно, следуй советам.
Ни $1,$2... ни $a,$b(в сортировке) объявлять не надо.
Убедится, что они инициализированы(иными словами не undef) не лишнее. Это можно сделать как в регулярке, так и при сортировке.
Впрочем, можно и блокировать вывод предупреждений в некоторых моментах. Но тут решать только тебе.
-
AnnA
#!/usr/bin/perl -w - use warning
Use of uninitialized value in substitution (s///) at arc.cgi line 75
Предупреждение, о том, что регулярное выражение применяется к неопределенной переменной, неопределена, не значит не объявлена, а значит пустая, undef...
Просто при использовании регулярных выражений, сначала проверь переменную...
-
погодите-ка, добрый человек.
ondr:
Убедится, что они инициализированы(иными словами не undef) не лишнее. Это можно сделать как в регулярке, так и при сортировке.
все же переписать так: use vars qw(среди прочего есть и $nomer $1);
или перед line 75 написать my $1;
ondr:
Впрочем, можно и блокировать вывод предупреждений в некоторых моментах.
нет. мне такое не подходит: я ведь должна быть в курсе того, что там происходит. ;)
-
попробовала и так и так. ошибки в логе нет. но... как-то это неправильно.
-
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\'}
Сдалает то же самое, но предупреждения не выдаст...
-
AnnA
my(), local(), use vars qw() объявляют переменную, но с присвоением ей значения они никак не связанны. В данном, конкретном случае они не требуются.
-
Phoinix, ondr спасибочки :chmok:
вот уж разложили все по полочкам. :appl:
... но я так ничего и непоняла... ;) шутка.
написала так: $nomer=~s/\\b0(\\d+?)/$1/ if $1;
и в логе тишина. :)
люблю этот форум за то, что отвечают оперативно и по делу.
-
и в логе тишина
И на экране тоже :)
ps: Условный переход обрабатывается раньше чем действие на это условие. Соответствено содержимое сис. переменной $1 в данной проверке никак не связано с действиями в данной регулярке ;)