perl+STDIN+поиск по шаблону
есть файл 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";
}
}
}
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";
}
}
}
если вводить одно слово то всё хорошо, но если ввести предложение с этим суествующим словом то не катит.как разрешить?
Дальше Вашу программу можно частично переписать так:
Код:
open $fh, '<', './base' or die('error opening file "base"!');
@file = <$fh> # в @file теперь находится массив строк из файла.
# ... Дальше, думаю, несложно искать в строке,
# не обходя каждый раз файл.
@file = <$fh> # в @file теперь находится массив строк из файла.
# ... Дальше, думаю, несложно искать в строке,
# не обходя каждый раз файл.
Для того, чтобы проверить, входит ли не вся введенная строка, а хотя бы одно слово из введенной строки, в список в файле, нужно разбить строку на массив, чтобы его обходить функцией split(), у которой синтаксис такой:
Код:
@strings = split $delimiter, $string, $limit;
Код:
if (join("\n",@file) =~ /(\n)?$a(\n)?/gi) {
#yes
}
#yes
}
и если так, то разбивать надо на пробелы?
Разбивать надо и то, и то. И каждый элемент одного массива сравнивать с каждым элементом другого.
Код:
#!/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;
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 сразу записываться в массив и может ли вообще быть масивом?
не возвращает массив - только одну строчку, причем оставляет в конце перевод строки, поэтому лучше всегда 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;
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;