Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

perl+STDIN+поиск по шаблону

9.0K
16 апреля 2007 года
elvenoracle
56 / / 16.04.2007
подскажите
есть файл base содержащий:
мир
труд
май
есть код:
Код:
#!/usr/bin/perl
open (FILE, "base") or die "error open file base";
while (1) {
seek (FILE,0,0);
$a = <STDIN>;
chomp $a;
while (<FILE>) {
if (/$a/g) {
print "да, такое слово есть в базе\n";
  }
 }
}

если вводить одно слово то всё хорошо, но если ввести предложение с этим суествующим словом то не катит.как разрешить?
239
16 апреля 2007 года
Dolonet
1.7K / / 20.05.2000
Для начала хочу напомнить, что файлы надо закрывать. И что теги [ PHP ] и [/ PHP ] никто не отменял (ну или [ CODE ]).

Дальше Вашу программу можно частично переписать так:
 
Код:
open $fh, '<', './base' or die('error opening file "base"!');
@file = <$fh> # в @file теперь находится массив строк из файла.
# ... Дальше, думаю, несложно искать в строке,
# не обходя каждый раз файл.

Для того, чтобы проверить, входит ли не вся введенная строка, а хотя бы одно слово из введенной строки, в список в файле, нужно разбить строку на массив, чтобы его обходить функцией split(), у которой синтаксис такой:
 
Код:
@strings = split $delimiter, $string, $limit;
92
17 апреля 2007 года
Тень Пса
2.2K / / 19.10.2006
а можно проверить regExp'ом на join("\n", @file); например.... чтобы циклом не бегать....

 
Код:
if (join("\n",@file) =~ /(\n)?$a(\n)?/gi) {
   #yes
}
9.0K
22 апреля 2007 года
elvenoracle
56 / / 16.04.2007
я не понял, разбивать через split надо то что STDIN или массив который указывает на файл base?
и если так, то разбивать надо на пробелы?
239
22 апреля 2007 года
Dolonet
1.7K / / 20.05.2000
Разбивать надо и то, и то. И каждый элемент одного массива сравнивать с каждым элементом другого.
9.0K
22 апреля 2007 года
elvenoracle
56 / / 16.04.2007
получается что правильный вариант вот такой?:
 
Код:
#!/usr/bin/perl
open (FILE, "base") or die "error open file base";
@file = <FILE>;
@file = split / /;
$a = <STDIN>;
$a = split / /;
if (@file =~/$a/) {
print "yes \n"
}
close FILE;


а может ли STDIN сразу записываться в массив и может ли вообще быть масивом?
16K
22 апреля 2007 года
unplugged
21 / / 27.11.2006
Этот вариант совсем некорректен - возвращает yes при любой строке в STDIN. STDIN в угловых скобках разумеется никогда
не возвращает массив - только одну строчку, причем оставляет в конце перевод строки, поэтому лучше всегда chomp-ить после <STDIN>.
Вот эта строчка, вероятно, выдаст Вам только последнюю строку файла, разбитую по пробелам - не проверял ) :
@file = split / /;
Потом, split всегда возвращает список, вот это вряд ли может работать верно, если есть хоть один пробел в получаемой строке:
$a = split / /;
Вариант кода для поиска по вхождению любого из слов, разделенных пробелами, может быть например таким:
Код:
#!/usr/bin/perl
use strict;

open (FILE, "base") or die "error open file base";
my @file = <FILE>;
my $a = <STDIN>;
chomp $a;
my @words = split / / , $a;

foreach my $f (@file) {
        foreach (@words) {
                print "yes" if $f =~ /$_/;
        }
}

close FILE;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог