Forum Webscript.Ru
Программирование => Perl => Тема начата: LEO от 10 Апреля 2001, 15:46:40
-
Есть текстовый файл. Каждая строчка - отдельная фраза или предложение. Как произвести поиск по одному слову внутри этого файла perl-скриптом и записать все найденные строчки с этим словом в массив. А если влет, то как находить совпадения по друм и более словам?
Желательно рабочий пример. :)
-
$file = "file.txt"; # Файл
$search = "Слово"; # Слово для поиска
open(FILE,"$file);
while()
{if(/$search/i){push @matches, $_;}}
close(DATAFILE);
В масиве @matches строки из файла содержащие слово $search.
-
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" тоже будет найдена, как подходящая?
-
Да, в масив будут помещены все строки из файла содержащие последовательность символов $search с учетом регистра.
-
ILYA (11-04-2001 09:20):
Да, в масив будут помещены все строки из файла содержащие последовательность символов $search с учетом регистра.
Спасибо.
Тогда последний вопрос: как разделить переменную $search на отдельные слова, если она содержить два и более слова?
-
@words = split(/\\s/, $search);
-
Ilya:
Да, в масив будут помещены все строки из файла содержащие последовательность символов $search с учетом регистра.
судя по книге:
/i # игнорировать реестр
судя по тестам - совсем наоборот.
так как же заставить его игнорировать регистр?
-
чудесно, но небольшой ответ был как раз топиком ниже :)
неужели так будет правильней всего?
$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);
-
$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. Тогда регистр сохранится :)