Если вы выполняете только один цикл, использовать цикл while - это нормально.Хотя, конечно, вам нужно исправить свой синтаксис.
Вы также можете использовать grep
:
print grep /$userInput/, <INPUT>;
Если вы хотите сделать несколько поисков, вы можете либо снова открыть дескриптор файла(если файл большой), или сохраните его в массиве:
print grep /$userInput/, @array;
Конечно, у вас будут мета-символы.Это может быть хорошо или плохо, в зависимости от ваших пользователей.Например, опытный пользователь распознал бы возможность уточнить свой поиск, введя поисковый термин, такой как ^foo(?=bar)
, тогда как другие люди могут очень запутаться, когда не могут найти строку foo+bar
.
Чтобы избежать метасимволов, используйте quotemeta
на своем входе.Другой способ - использовать \Q ... \E
внутри вашего регулярного выражения.
$userInput = quotemeta($userInput);
# or
print grep /\Q$userInput\E/, <INPUT>;
Полагаю, на вашем месте я бы использовал подпрограмму для поиска.Таким образом, вы можете легко выполнять столько поисков, сколько захотите.
use strict;
use warnings; # ALWAYS use these
print "Please Enter the word to find: ";
chomp (my $userInput = <>); # <> is a more flexible handle
print lookup($userInput);
sub lookup {
my $word = shift;
open my $fh, "<", $inputfile or die $!;
my @hits;
while (<$fh>) {
push @hits, $_ if /\Q$word\E/;
}
return @hits;
}