Forum Webscript.Ru

Программирование => Perl => Тема начата: ZDV от 28 Июня 2005, 12:43:51

Название: Помогите одалеть perl. чувствительность к регистру в регулярных выражениях
Отправлено: ZDV от 28 Июня 2005, 12:43:51
Это фрагмент кода программы для поиска по сайту:

while ()  {
if (/$query/io) {
s|$query|$query|gio;
push @{ $matches{$full_path}{content} }, $_;
$matches{$full_path}{file} = $file;
$matches{$full_path}{num_matches}++;
}
}

Не смотря на то, что в строке /$query/io стоит "i" программа все равно обращает внимание на регистр!!!!
В чем дело?

И еще пару Вопросов:
1. Почему могут из десятка текстовых файлов, обрбатываемых параметром -Т, только несколько определяются, как тектовые?
2. Как организавать поиск только по заданным тегам, например

Название: Помогите одалеть perl. чувствительность к регистру в регулярных выражениях
Отправлено: glebushka от 28 Июня 2005, 23:30:33
Цитировать
ZDV:
В чем дело?

Перл не воспринимает символы в твоей строке как буквы.
Подробнее: man perllocale
Цитировать
ZDV:
1. файлов, обрбатываемых параметром -Т

это как?:)
Цитировать
ZDV:
2. Как организавать поиск только по заданным тегам, например


в чём у тебя возникла проблема? Подумать и организовать.
Название: Помогите одалеть perl. чувствительность к регистру в регулярных выражениях
Отправлено: ZDV от 29 Июня 2005, 10:35:01
glebushka

1. Можете по подробнее рассказать, как решить эту проблему?
Я пробовал устанавливать кодировку, но это не помогло:

    $locale = "Russian_Russia.1251";
    setlocale(LC_CTYPE, $locale);

2.  foreach $file (@files) {
          if (-T $file) {
         #что-то делаем      
         }
       }
При такой конструкции perl воспринимает почему-то из десятка текстовых (*.html) файлов только несколько как текстовые, а остальные не понятно как????

Может я что-то не допонимаю?

3. Для меня регулярные выражения в perl - сущий ад: то они работают, то нет. то переменная $_ содержит что надо, то нет. В php у меня таких проблем нету, но хочится perl победить!!!!
Мне нужно просмотреть в файле все теги

,  и на предмет наличия в них искомой строки. то что в <title> и рядом с искомой строкой сохранить в отдельные переменные<br /><br />while (<FILE>) {<br />   if (/<title>(.*)<\\/title>/i) {<br />     $title = $_; #$_ почему-то оказывается пустой!!!<br />   }<br />   if ((m/<p(.*)>(.*)$query(.*)<\\/p>/i)or<br />      (m/<h(.*)>(.*)$query(.*<\\/h>/i)or<br />     (m/<title>(.*)$query(.*)<\\/title>/i))<br />{$text = $_; Вроде работает!<br />}<br />}<br />+ еще  скрипт оказывается чувствительным к регистру!<br /><br />Наверно я все-таки что-то делаю не провильно!<br /><br />Помогите разобраться, а то я навсегда возненавижу per, а я хочу с ним дружить. </dd> <dt class="postheader"> Название: <strong>Помогите одалеть perl. чувствительность к регистру в регулярных выражениях</strong><br /> Отправлено: <strong>NeoNox</strong> от <strong>29 Июня 2005, 12:39:22</strong> </dt> <dd class="postbody"> 1) perldoc perlre<br />2) FAQ к этому форуму( use warnings use и use strict обязательны )<br />3) $_ это элемент из FILE а не совпадение. Использовать $1..$n<br />4) Таги разбираются не руками а модулем, к примеру HTML::TokeParser </dd> <dt class="postheader"> Название: <strong>Помогите одалеть perl. чувствительность к регистру в регулярных выражениях</strong><br /> Отправлено: <strong>Ivan Kolesnikov</strong> от <strong>29 Июня 2005, 13:49:52</strong> </dt> <dd class="postbody"> 1)<br /><div class="codeheader">Код: <a href="javascript:void(0);" onclick="return smfSelectText(this);" class="codeoperation">[Выделить]</a></div><code class="bbc_code"><br />use strict;<br />use locale;<br /><br />my $test = \'АБС\';<br />print $test =~ /б/io ? "yes\\n" : "no\\n";<br /></code><br />Выводит yes.<br />Можно уточнить проблему: не получается с русскими буквами или с латиницей тоже? Может быть кодировка Unicode<br />2)<br />Может быть действительно остальные файлы не в кодировке win1251, а скажем в unicode? Тогда действительно -T возвращает false.<br />3)<br />Я бы не стал надеется, что теги распологаются на одной строке, скорее всего ты на этом и попался, ведь ты читаешь и обрабатываешь файл построчно. <strong>NeoNox</strong> прав в $_ находится строка из файла, тебе нужно $1 </dd> <dt class="postheader"> Название: <strong>Помогите одалеть perl. чувствительность к регистру в регулярных выражениях</strong><br /> Отправлено: <strong>ZDV</strong> от <strong>30 Июня 2005, 00:11:05</strong> </dt> <dd class="postbody"> <strong>Ivan Kolesnikov</strong> <br />с латиницей все ОК. Не работает только с русскими буквами. <br />По поводу кодировки: в броузере все страницы просматриваются в кодировке "Кирилица (Windows)", да и в мета теге установлена windows-1251 </dd> <dt class="postheader"> Название: <strong>Помогите одалеть perl. чувствительность к регистру в регулярных выражениях</strong><br /> Отправлено: <strong>Yaroslav</strong> от <strong>30 Июня 2005, 19:36:41</strong> </dt> <dd class="postbody"> что такое $1..$n? </dd> <dt class="postheader"> Название: <strong>Помогите одалеть perl. чувствительность к регистру в регулярных выражениях</strong><br /> Отправлено: <strong>NeoNox</strong> от <strong>30 Июня 2005, 23:58:25</strong> </dt> <dd class="postbody"> perldoc perlre<br />Есть где-то документация по-русски. Отвечу примером:<br /><div class="quoteheader"><div class="topslice_quote">Цитировать</div></div><blockquote class="bbc_standard_quote">    <br />    $time = "Time: 23:11:10"; <br />    <br />    if ($time =~ m/Time: (..):(..):(..)/) <br />    {<br />        $hours    = $1;<br />        $minutes = $2;<br />        $seconds = $3;<br />    }<br /></blockquote><div class="quotefooter"><div class="botslice_quote"></div></div> </dd> </dl> <div id="footer" class="smalltext"> <span class="smalltext" style="display: inline; visibility: visible; font-family: Verdana, Arial, sans-serif;"><a href="http://forums.webscript.ru/index.php?PHPSESSID=pqo0rmtuhgbfcpg3efnvt414v1&action=credits" title="Simple Machines Forum" target="_blank" class="new_win">SMF 2.0.19</a> | <a href="http://www.simplemachines.org/about/smf/license.php" title="License" target="_blank" class="new_win">SMF © 2016</a>, <a href="http://www.simplemachines.org" title="Simple Machines" target="_blank" class="new_win">Simple Machines</a> </span> </div> </body> </html>