А какого эффекта ты хочешь добиться?
U> А какого эффекта ты хочешь добиться?
Проверка наличия в коде страницы, заданного урла. С удивлением обнаружил что
если этот урл содержит звездочки, выражение находить этот урл категорически
отказывается. Хотя, сам урл вынесен в отдельную переменную. Локализация ошибки
и привела к указанному ранее коду. Если поменять тестовый код на
$Text='a/*b';
$Text1='a\/\*b';
print 'error' unless $Text=~/$Text1/;
<>;
все работает, но логика такой замены от меня ускользает. Если Перл раскрывал
$Text=~/$Text/ в $Text=~/a/*b/, он по идее должен был не "error" писать, а
выругаться на синтаксическую ошибку. Hу и как лечить - непонятно. Прежде чем
вставлять переменную в выражение, экранировать в ней обратными слешами вообще
все, что может быть воспринято как служебный символ? Хотелось бы какое-то
более элегантное решение.
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
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, � ��� ������
��������� ����.
Чему ж тут удивляться? В регулярных выражениях звёздочка означает "0 и более
символов".
"a/*b" будет матчить "ab", "a/b", "a//b" и т.д., но не "a/*b".
Это как бы основы регулярных выражений, зачем ты вообще их применяешь если даже
не знаешь что это такое?
> выругаться на синтаксическую ошибку. Hу и как лечить - непонятно. Прежде чем
> вставлять переменную в выражение, экранировать в ней обратными слешами
> вообще
> все, что может быть воспринято как служебный символ?
Если нужен поиск заданной строки как есть, а не регулярные выражения, то просто
используй функцию index.
AM> ���� � ��� ����������? � ���������� ���������� �ף������ �������� "0 �
AM> ����� ��������".
���������� ���� ����, ��� ��������� ����-�� ��� �������� � _����������_
���������� ���������. ������ ��� �������� ���������� ����������� � SQL
��������, �� �� ������ ��� ���� �������� � ����.
>> ���������� �� �������������� ������. H� � ��� ������ - ���������. ������
>> ��� ��������� ���������� � ���������, ������������ � ��� ���������
>> ������� ������ ���, ��� ����� ���� ���������� ��� ��������� ������?
AM> ���� ����� ����� �������� ������ ��� ����, � �� ���������� ���������, ��
AM> ������ ��������� ������� index.
� ���� ��� ��� ����� ����������, ������� ����-�� � ����
"<a [^>]*?href="$Url"[^>]*?>$Text<\/a>"? ������� �� ��������� ��������, ��
�������� �� ��� �� ��� ���� ��������.
��� ������� �� �� ������ ���������, ��� ����� ���������� ���������.
���������� ��������� -- ��� ���� ������ ������� � ���� ������.
� =~ 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>
�� ��� � ��������� ������� �� ��������.
Привет, 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
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 не экранирует согласно документации
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