Автор Тема: ошибка в error.log(регулярка)  (Прочитано 4557 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ошибка в error.log(регулярка)
« : 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 для сравнения в сортировке.
Подскажите - чего я делаю не так-то.

спасибо.
пока-пока. :)

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
ошибка в error.log(регулярка)
« Ответ #1 : 24 Июня 2004, 15:11:51 »
AnnA

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

Исправить можно так:
$nomer =~s /\\b0(\\d+?)/$1/ if $nomer;

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ошибка в error.log(регулярка)
« Ответ #2 : 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);
нонсенс. :(
пока-пока. :)

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
ошибка в error.log(регулярка)
« Ответ #3 : 24 Июня 2004, 15:23:06 »
Нет, не издевается. Всё верно, следуй советам.
Ни $1,$2... ни $a,$b(в сортировке) объявлять не надо.
Убедится, что они инициализированы(иными словами не undef) не лишнее. Это можно сделать как в регулярке, так и при сортировке.
Впрочем, можно и блокировать вывод предупреждений в некоторых моментах. Но тут решать только тебе.
0 OK, 0:1

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
ошибка в error.log(регулярка)
« Ответ #4 : 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...
Просто при использовании регулярных выражений, сначала проверь переменную...

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ошибка в error.log(регулярка)
« Ответ #5 : 24 Июня 2004, 15:30:26 »
погодите-ка, добрый человек.
Цитировать
ondr:
Убедится, что они инициализированы(иными словами не undef) не лишнее. Это можно сделать как в регулярке, так и при сортировке.

все же переписать так: use vars qw(среди прочего есть и $nomer $1);
или перед line 75 написать my $1;
Цитировать
ondr:
Впрочем, можно и блокировать вывод предупреждений в некоторых моментах.
нет. мне такое не подходит: я ведь должна быть в курсе того, что там происходит. ;)
пока-пока. :)

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ошибка в error.log(регулярка)
« Ответ #6 : 24 Июня 2004, 15:31:24 »
попробовала и так и так. ошибки в логе нет. но... как-то это неправильно.
пока-пока. :)

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
ошибка в error.log(регулярка)
« Ответ #7 : 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\'}


Сдалает то же самое, но предупреждения не выдаст...

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
ошибка в error.log(регулярка)
« Ответ #8 : 24 Июня 2004, 15:42:07 »
AnnA
my(), local(), use vars qw() объявляют переменную, но с присвоением ей значения они никак не связанны. В данном, конкретном случае они не требуются.
0 OK, 0:1

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
ошибка в error.log(регулярка)
« Ответ #9 : 24 Июня 2004, 15:52:04 »
Phoinix, ondr спасибочки :chmok:
вот уж разложили все по полочкам. :appl:
... но я так ничего и непоняла... ;) шутка.
написала так: $nomer=~s/\\b0(\\d+?)/$1/ if $1;
и в логе тишина. :)
люблю этот форум за то, что отвечают оперативно и по делу.
пока-пока. :)

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
ошибка в error.log(регулярка)
« Ответ #10 : 24 Июня 2004, 16:19:26 »
Цитировать
и в логе тишина

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

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

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28