Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

òÅÇÕÌÑÒÎÙÅ ×ÙÒÁÖÅÎÉÑ

1 view
Skip to first unread message

Soldatenkov Mitea

unread,
Dec 14, 2010, 1:25:55 PM12/14/10
to
Hi all!
$Text='a/*b';
print 'error' unless $Text=~/$Text/;
<>;
Вопрос к знатокам Перла - он и должен на этом коде с ошибкой вылетать?
Если да, то как сделать чтоб не вылетал?

Alex Mizrahi

unread,
Dec 14, 2010, 2:58:05 PM12/14/10
to
SM> $Text='a/*b';
SM> print 'error' unless $Text=~/$Text/;
SM> <>;
SM> Вопрос к знатокам Перла - он и должен на этом коде с ошибкой вылетать?
SM> Если да, то как сделать чтоб не вылетал?

А какого эффекта ты хочешь добиться?

Soldatenkov Mitea

unread,
Dec 15, 2010, 10:06:04 AM12/15/10
to
Привет, Alex Mizrahi!
Ты вроде писал(а) в эху SU.CHAINIK.GENERAL следуюшее:

SM>> Вопрос к знатокам Перла - он и должен на этом коде с ошибкой вылетать?
SM>> Если да, то как сделать чтоб не вылетал?

U> А какого эффекта ты хочешь добиться?
Проверка наличия в коде страницы, заданного урла. С удивлением обнаружил что
если этот урл содержит звездочки, выражение находить этот урл категорически
отказывается. Хотя, сам урл вынесен в отдельную переменную. Локализация ошибки
и привела к указанному ранее коду. Если поменять тестовый код на
$Text='a/*b';
$Text1='a\/\*b';
print 'error' unless $Text=~/$Text1/;
<>;
все работает, но логика такой замены от меня ускользает. Если Перл раскрывал
$Text=~/$Text/ в $Text=~/a/*b/, он по идее должен был не "error" писать, а
выругаться на синтаксическую ошибку. Hу и как лечить - непонятно. Прежде чем
вставлять переменную в выражение, экранировать в ней обратными слешами вообще
все, что может быть воспринято как служебный символ? Хотелось бы какое-то
более элегантное решение.

Stas Degteff

unread,
Dec 16, 2010, 10:35:48 PM12/16/10
to
Hello Soldatenkov!

14 Dec 10 21:25, you wrote to All:

SM> $Text='a/*b';
SM> print 'error' unless $Text=~/$Text/;
SM> <>;

SM> Вопрос к знатокам Перла - он и должен на этом коде с ошибкой вылетать?

Я не знаток, но ежли "вылетает", значит должен.

SM> Если да, то как сделать чтоб не вылетал?

print "error" unless $Text=~m%$Text%;


Stas
Jabber-ID: grum...@grumbler.org
GPG key 0x72186DB9 (keyserver: hkp://wwwkeys.eu.pgp.net)

... Golded+, Husky, RNTrack maintainer

Soldatenkov Mitea

unread,
Dec 17, 2010, 2:03:58 PM12/17/10
to
������, Stas Degteff!
�� ����� �����(�) � ��� SU.CHAINIK.GENERAL ���������:
SD> print "error" unless $Text=~m%$Text%;
H� ��������. ��� ����� ������ "error", ��� � �����.

Stas Degteff

unread,
Dec 18, 2010, 12:31:34 PM12/18/10
to
Hello Soldatenkov!

17 Dec 10 22:03, you wrote to me:

SM> ������, Stas Degteff!
SM> �� ����� �����(�) � ��� SU.CHAINIK.GENERAL ���������:


SD>> print "error" unless $Text=~m%$Text%;

SM> H� ��������. ��� ����� ������ "error", ��� � �����.

����� � ������ �� �����, ��� �� ����� �������. "�������� � �������" � �ϣ�
��������� - ������ ���������� �������.

� ��� - �� �������� ������ ���������� � ���������� ��������� �������� $Text �
���������, ��� error � ����� ���������. ������ � ���� � ������ RE, � ��� ������
��������� ����.

Alex Mizrahi

unread,
Dec 23, 2010, 5:10:35 AM12/23/10
to
> С удивлением обнаружил что
> если этот урл содержит звездочки, выражение находить этот урл категорически
> отказывается.

Чему ж тут удивляться? В регулярных выражениях звёздочка означает "0 и более
символов".

"a/*b" будет матчить "ab", "a/b", "a//b" и т.д., но не "a/*b".
Это как бы основы регулярных выражений, зачем ты вообще их применяешь если даже
не знаешь что это такое?

> выругаться на синтаксическую ошибку. Hу и как лечить - непонятно. Прежде чем
> вставлять переменную в выражение, экранировать в ней обратными слешами
> вообще
> все, что может быть воспринято как служебный символ?

Если нужен поиск заданной строки как есть, а не регулярные выражения, то просто
используй функцию index.

Soldatenkov Mitea

unread,
Dec 23, 2010, 11:40:14 AM12/23/10
to
������, Alex Mizrahi!
�� ����� �����(�) � ��� SU.CHAINIK.GENERAL ���������:
>> � ���������� ��������� ��� ���� ���� ��� �������� ���������, ���������
>> �������� ���� ��� ������������� ������������.

AM> ���� � ��� ����������? � ���������� ���������� �ף������ �������� "0 �
AM> ����� ��������".
���������� ���� ����, ��� ��������� ����-�� ��� �������� � _����������_
���������� ���������. ������ ��� �������� ���������� ����������� � SQL
��������, �� �� ������ ��� ���� �������� � ����.
>> ���������� �� �������������� ������. H� � ��� ������ - ���������. ������
>> ��� ��������� ���������� � ���������, ������������ � ��� ���������
>> ������� ������ ���, ��� ����� ���� ���������� ��� ��������� ������?

AM> ���� ����� ����� �������� ������ ��� ����, � �� ���������� ���������, ��
AM> ������ ��������� ������� index.
� ���� ��� ��� ����� ����������, ������� ����-�� � ����
"<a [^>]*?href="$Url"[^>]*?>$Text<\/a>"? ������� �� ��������� ��������, ��
�������� �� ��� �� ��� ���� ��������.

Alex Mizrahi

unread,
Dec 24, 2010, 10:24:01 AM12/24/10
to
AM>> ���� � ��� ����������? � ���������� ���������� �ף������ �������� "0 �
AM>> ����� ��������".
> ���������� ���� ����, ��� ��������� ����-�� ��� �������� � _����������_
> ���������� ���������.

��� ������� �� �� ������ ���������, ��� ����� ���������� ���������.
���������� ��������� -- ��� ���� ������ ������� � ���� ������.
� =~ m// -- ���, ����������, ��������, ������� ������������ ������ �����������
���������.
� ����������� ��������� ������� ���������� ���.
���������:

$foo =~ m/baz$bar/;

����� �������� ������, ��� ���� "�������������" ������ ������ ��������� m//, ��
���� ����� ���, ��� ��������� ��������� ����������� ������ $bar �� ��������
���� ������.

Perl ����� ������������ ��������� ���������, � ��� ����� ������ ��� �������
�������� ��

print "baz$bar";

��� $foo =~ m/baz$bar/;

� ����� ������� ���� � $bar ���� ������ "quux" �� ��� ����� ������������

print "bazquux" ��� $foo =~ m/bazquux/;

�� ���� ����� ��������, ��� ���������� ���������, ��������, �����������
��������� � ������������ -- ��� ��� ������ ���� � �������� ���, � �����-��,
����������.

����, � ��������, ������������ ����� �� � ������������� ����. �������. �� �����
���������� �� ��� ���������� �����, ��������, ������� ���. ��������� �� ����� �
��������� ���. �� ���� ���� �� �������.

> ������ ��� �������� ���������� ����������� � SQL
> ��������, �� �� ������ ��� ���� �������� � ����.

���, ��� ���� �������� ���, ���� �������� ��� ��� ��������.
� ���� ������� ��� ��������� ����� ������� ���-�� ���� ������ ������������, ���
�� ���� � ����, �� ����� �� -- �������� ����.

> � ���� ��� ��� ����� ����������, ������� ����-�� � ����
> "<a [^>]*?href="$Url"[^>]*?>$Text</a>"? ������� �� ��������� ��������, ��
> �������� �� ��� �� ��� ���� ��������.

������ �������? ���� ����������� ������� ��� ����� -- quotemeta.
������:

$Url_q = quotemeta($Url);

$bar =~ /<a [^>]*?href="$Url_q"[^>]*?>$Text</a>/;

� ��� ����������. ���� ����� ��� (Q...E):

$bar =~ /<a [^>]*?href="Q$UrlE"[^>]*?>$Text</a>

�� ��� � ��������� ������� �� ��������.

Stas Degteff

unread,
Dec 25, 2010, 9:46:00 AM12/25/10
to

Привет, Soldatenkov!

Мои добавления и комментарии к сообщению Alex Mizrahi (2:466/466.617) к
Soldatenkov Mitea, написанному 24 дек 10 в 18:24:

>> А если мне для пущей надежности, хочется чего-то в духе
>> "<a [^>]*?href="$Url"[^>]*?>$Text</a>"? Костыль то придумать
>> несложно, но хотелось бы все же без него обойтись.

AM> Почему костыль? Есть стандартная функция для этого -- quotemeta.
AM> Напиши:

AM> $Url_q = quotemeta($Url);

AM> $bar =~ /<a [^>]*?href="$Url_q"[^>]*?>$Text</a>/;

AM> и оно заработает. Либо можно так (Q...E):

Только тут Q и E предваряются обратным слэшем, т.е. "\Q" и "\E"

AM> $bar =~ /<a [^>]*?href="Q$UrlE"[^>]*?>$Text</a>
А тут ещё и RE не закрыто, правильно:
$bar =~ /<a [^>]*?href="\Q$Url\E"[^>]*?>$Text<\/a>/

AM> го оно в некоторых случаях не работает.
...потому что нужно быть *очень* внимательным. В любом случае нужно все RE
тестировать: там очень много тонкостей и неявных взаимодействий.

Stas Degteff

Alex Mizrahi

unread,
Dec 26, 2010, 11:56:26 AM12/26/10
to

AM>> Почему костыль? Есть стандартная функция для этого -- quotemeta.
AM>> Напиши:

AM>> $Url_q = quotemeta($Url);

AM>> $bar =~ /<a [^>]*?href="$Url_q"[^>]*?>$Text</a>/;

AM>> и оно заработает. Либо можно так (Q...E):

> Только тут Q и E предваряются обратным слэшем, т.е. "Q" и "E"

Угу. Я, разумеется, с бэкслэшами написал, а fidonet-online.org их съел.

AM>> $bar =~ /<a [^>]*?href="Q$UrlE"[^>]*?>$Text</a>
> А тут ещё и RE не закрыто, правильно:

И здесь тоже.

> $bar =~ /<a [^>]*?href="Q$UrlE"[^>]*?>$Text</a>/

AM>> го оно в некоторых случаях не работает.
> ...потому что нужно быть *очень* внимательным.

Видимо разработчики webfido были не очень внимательны :)

Я вообще про то, что $ и ^ Q..E не экранирует согласно документации

Yury Roschupkin

unread,
Dec 28, 2010, 10:49:46 AM12/28/10
to
Hi!

26 дек 10 19:56, Alex Mizrahi wrote to Stas Degteff:

[...abridged...]

AM> Видимо разработчики webfido были не очень внимательны :)

Разработчик у Wfido один - Макс Лушников. В свое время он активно занимался
кодом, устранил кучу багов. Кстати, он поначалу даже кидал клич, приглашал
желающих поучаствоать в разработке. Hо таковых не нашлось, а сам Макс стал все
больше залегать на дно. Когда я запустил фидонет-онлайн, то первое время
регулярно сообщал автору о замеченных глюках/багах, но он так и не нашел
времени или сил... Так что положение может изменить только участие
php-программиста (увы, я не он).
Сам же код открыт и доступен для скачивания с сайта автора.

AM> --- wfido
AM> * Origin: Отправлено через http://fidonet-online.org (2:466/466.0)

--
WBR, YuR

0 new messages