Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Perl: регулярное выражение s/// работает некорректно

40K
15 марта 2009 года
singaporian
12 / / 23.01.2009
народ, нужна помощь. Есть проблема, но всю длинную партянку кода писать не буду, выдеру только саму проблему.

скрипт выдает ошибку "Use of uninitialized value in substitution (s///) at ..."

Цитата:
while (<$session>) {
my $data = $_;
s/^%\^//; # вот он сволочь - не хочет строку $data, начинающуюся с % делать нолем !!!
}




что могло случиться ? как это так я должен объявить регулярное выражение ?

2
15 марта 2009 года
squirL
5.6K / / 13.08.2003
меня дико умиляют такие заголовки "регулярное выражение работает некорректно".

оно работает абсолютно корректно. и делает именно то, что вы написали. я не знаю, что вы хотели сделать, а сделали вы вот что:
 
Код:
while (<$session>) {[COLOR="Red"]
# тут я, непонятно на кой хрен,
#создал переменную $data, которая умрет по окончании цикла[/COLOR]
my $data = $_; [COLOR="#ff0000"]
# а тут я в переменной $_ удаляю стоящую
# в начале строки последовательность %^ [/COLOR]
s/^%\^//;
}


и в чем проблема? код отлично делает то, что вы запрограммировали.
40K
15 марта 2009 года
singaporian
12 / / 23.01.2009
я вырезал все лишнее (например еще до окончания цикла $data отправляется в дескриптор, а новое значение $_ во вложенном цикле переписывает старое значение и потому мне пришлось его вынести в другую переменную - но это не важно, и чтобы не загромождать код, тут я его вырезал). Не ищите не грамотность - ее нельзя оценить по обрывку кода, ищите ошибку в синтаксисе, пожалуйста. Хорошо, перепишу еще проще:

my $a = "hello";
s/hello/bye/;
print $a;


вот такой вариант не заменит значение $a на "bye". В случае ключа "perl -w" - просто выведет ошибку и выведет hello, в случае "perl -X" - просто выведет hello. Почему ? Судя по всем докам - правильно. Но не работает.
2
15 марта 2009 года
squirL
5.6K / / 13.08.2003
Цитата: singaporian

Не ищите не грамотность - ее нельзя оценить по обрывку кода, ищите ошибку в синтаксисе, пожалуйста.


давайте я сам буду определять, что мне искать? у вас нету ошибок в синтаксисе. у вас есть ошибка в семантике.

Цитата: singaporian

Хорошо, перепишу еще проще:

my $a = "hello";
s/hello/bye/;
print $a;

вот такой вариант не заменит значение $a на "bye". В случае ключа "perl -w" - просто выведет ошибку и выведет hello, в случае "perl -X" - просто выведет hello. Почему ? Судя по всем докам - правильно. Но не работает.


я вас сильно удивлю, если скажу, что такой вариант и не должен менять значение $a на "bye"? попробуйте мне объяснить, в каком месте из трех строчек, вы применяете к переменной $a регулярное выражение?

кстати, с ключом -w будет выдана не ошибка, а предупреждение (warning)
Use of uninitialized value in substitution (s///) at -e line 2.
если взять словарь и перевести - никаких мыслей не появится?

92
15 марта 2009 года
Тень Пса
2.2K / / 19.10.2006
[COLOR=DimGray]начитаются постоянно где-то шивками-урывками...[/COLOR]

оператор =~ тебе в помощь, автор ) (в случае номер 2)
в случае 1 - правильно тебе squirL сказал, "нафига-то я здесь создал переменную..."

и прежде, чем сказать "неучитеменяжить", смотрим на репутацию человека вам отвечающего... а то, смотрю, новички пошли - "помогите! прошуажнемогу!", а потом "а чо вы меня жить учите?!"... :)
40K
15 марта 2009 года
singaporian
12 / / 23.01.2009
Цитата: squirL
я вас сильно удивлю, если скажу, что такой вариант и не должен менять значение $a на "bye"? попробуйте мне объяснить, в каком месте из трех строчек, вы применяете к переменной $a регулярное выражение?



вот то что я и хотел услышать. Просто в учебниках, по которым я учу Perl написан мой не рабочий вариант. Я задумывался над этим, но решил, что просто регулярное выражение работает над той переменной, которая была непосредственно до него. Спасибо.



Цитата: Тень Пса
[COLOR=DimGray]начитаются постоянно где-то шивками-урывками...[/COLOR]

оператор =~ тебе в помощь, автор ) (в случае номер 2)
в случае 1 - правильно тебе squirL сказал, "нафига-то я здесь создал переменную..."

и прежде, чем сказать "неучитеменяжить", смотрим на репутацию человека вам отвечающего... а то, смотрю, новички пошли - "помогите! прошуажнемогу!", а потом "а чо вы меня жить учите?!"... :)


я не неачитался шивочками-урывочками. Я очень внимательно прочитал две книги, просто я еще учусь и ни на что не претендую. Вы полагаете, что я должен тут только отвечать и ничего не спрашивать ? В книгах были некорректные примеры. Не надо пожалуйста оскорблять неразобравшись. Что касается "правильно тебе squirL сказал, "нафига-то я здесь создал переменную..."" - я разве невнятно написал, что там 100 строк кода вырезано ? Эта переменная уходит еще до знака } и внутренний цикл ее переписывает, после чего я опять к ней обращаюсь. Но для Вашего же удобства, чтобы Вы же не копались в моем гавне я это лишнее вырезал. Причем настолько, чтобы Вы одним взглядом поняли, где ошибка. Как оказалось я был прав - Вам было достаточно этого отрезка, чтобы направить меня на нужный путь, но обвинений я услышал как будто я Гитлер. Ладно, в следующий раз либо выставлю весь код на несколько сотен строк, либо вообще воздержусь от вопросов.
Спасибо за внимание

2
15 марта 2009 года
squirL
5.6K / / 13.08.2003
Цитата: singaporian
вот то что я и хотел услышать. Просто в учебниках, по которым я учу Perl написан мой не рабочий вариант. Я задумывался над этим, но решил, что просто регулярное выражение работает над той переменной, которая была непосредственно до него. Спасибо.


вы читаете плохие книги.
вот две книги, прочтения которых достаточно для грамотного программирования на Perl.
http://books.sysfaq.ru/Programming/Perl%20cookbook.DjVu
http://books.sysfaq.ru/Programming/Perl%20cookbook.DjVu

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

40K
15 марта 2009 года
singaporian
12 / / 23.01.2009
пробежался по оглавлению - действительно более подробно чем то что я читал. Вот за это еще большее спасибо !!!

Кстати на вторую книгу ссылка от первой )))

P.S. я не обижаюсь
2
15 марта 2009 года
squirL
5.6K / / 13.08.2003
Цитата: singaporian
пробежался по оглавлению - действительно более подробно чем то что я читал. Вот за это еще большее спасибо !!!

Кстати на вторую книгу ссылка от первой )))

P.S. я не обижаюсь



пардон, дал две ссылки на Cookbook. Вот основная книжка по Perl
http://books.sysfaq.ru/Programming/Perl_programming(camel%20book).djvu

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог