Forum Webscript.Ru

Программирование => Perl => Тема начата: LEO от 10 Апреля 2001, 15:46:40

Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: LEO от 10 Апреля 2001, 15:46:40
Есть текстовый файл. Каждая строчка - отдельная фраза или предложение. Как произвести поиск по одному слову внутри этого файла perl-скриптом и записать все найденные строчки с этим словом в массив. А если влет, то как находить совпадения по друм и более словам?
Желательно рабочий пример. :)
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: Ilya от 10 Апреля 2001, 19:29:33
$file = "file.txt"; # Файл
$search = "Слово"; # Слово для поиска

open(FILE,"$file);
while()
{if(/$search/i){push @matches, $_;}}
close(DATAFILE);

В масиве @matches строки из файла содержащие слово $search.
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: LEO от 10 Апреля 2001, 21:38:34
Цитировать
ILYA (10-04-2001 19:29):
$file = "file.txt"; # Файл
$search = "Слово"; # Слово для поиска

open(FILE,"$file);
while()
{if(/$search/i){push @matches, $_;}}
close(DATAFILE);

В масиве @matches строки из файла содержащие слово $search.

Спасибо за точный и быстрый ответ. Но у меня еще вопрос:
это в смысле, даже если слово находиться в середине строки?
И еще: а если я ввожу, например, для поиска слово "mu", то строка, которая содержит слово "omut" тоже будет найдена, как подходящая?
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: Ilya от 11 Апреля 2001, 09:20:12
Да, в масив будут помещены все строки из файла содержащие последовательность символов $search с учетом регистра.
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: LEO от 11 Апреля 2001, 11:17:12
Цитировать
ILYA (11-04-2001 09:20):
Да, в масив будут помещены все строки из файла содержащие последовательность символов $search с учетом регистра.

Спасибо.
Тогда последний вопрос: как разделить переменную $search на отдельные слова, если она содержить два и более слова?
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: AliMamed от 11 Апреля 2001, 12:32:41
@words = split(/\\s/, $search);
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: Yaroslav от 29 Июня 2005, 15:21:03
Цитировать
Ilya:
Да, в масив будут помещены все строки из файла содержащие последовательность символов $search с учетом регистра.

судя по книге:
/i   # игнорировать реестр
судя по тестам - совсем наоборот.
так как же заставить его игнорировать регистр?
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: Yaroslav от 29 Июня 2005, 15:31:25
чудесно, но небольшой ответ был как раз топиком ниже :)
неужели так будет правильней всего?

$search="сОлн";
$search=~tr/A-Z/a-z/; $search=~tr/А-Я/а-я/;

open (LIST,"$file");
while () {
  $_=~tr/A-Z/a-z/; $_=~tr/А-Я/а-я/;
  if (/$search/) { push @matches, $_; }    #тогда /i уже не надо
}
close (LIST);
Название: Поиск по TXT-файлу perl-скриптом...
Отправлено: Ivan Kolesnikov от 30 Июня 2005, 10:49:40
Цитировать

$search=~tr/A-Z/a-z/; $search=~tr/А-Я/а-я/;

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

use locale;
$search=lc "сОлн";
open (LIST,"$file");
while ( ) {
  $_ = lc $_;
  if (/$search/) { push @matches, $_; }    #тогда /i уже не надо
}
close (LIST);


Это прагма указывает что для изменение регистра нужно использовать текущую локаль.

Это в том случае если нужно чтобы в результате было все в нижнем регисте, а если не нужно, то лучше использовать модификатор i. Тогда регистр сохранится :)