Вы неправильно поняли, что делает функция grep
.Он оценивает выражение (в данном случае $name
) для каждого переданного ему элемента, и если true, этот элемент возвращается.Если $name
содержит значение, то оно всегда будет истинным, поэтому будет возвращать каждую строку в файле и всегда выводит результат "Найдено".
Вместо этого вы хотите использовать обычнуювыражение.Вот как выглядит регулярное выражение.
if($somevalue =~ /pattern/)
Вы хотите обработать каждую строку, поэтому вам также понадобится цикл, например while
.Если вы пропустите $somevalue
, как и многие функции и операторы Perl, по умолчанию будет $_
, что и будет использоваться в этом цикле для предоставления каждой строки файла.А поскольку $name
может содержать символы, которые считаются специальными в регулярных выражениях, то окружение его \ Q и \ E означает, что оно будет обрабатываться как обычные символы.
my $found=0;
while(<FILE>)
{
if( /\Q$name\E/ )
{
$found=1;
}
}
if($found)
{
print "Found\n";
}
else
{
print "word not found\n";
}
Вы также используетеустаревший метод открытия файла, а также не проверка его открытия.Попробуйте заменить его на
if(open(my $file, "<", "/home/server/test2.txt"))
{
# Your code to process the file goes inside here
close($file);
}
PS Не забудьте заменить <FILE>
на <$file>