Perl regex: как найти в файле слово, набранное пользователем - PullRequest
1 голос
/ 10 марта 2012

Я пишу скрипт для чтения файла LOG.Я хочу, чтобы пользователь набрал слово, а затем нашел его и напечатал строку (из строки), соответствующую слову.

Я просто изучаю Perl, поэтому, пожалуйста, будьте очень конкретны и просты, чтобы я мог это понять.

 print "Please Enter the word to find: ";
 chomp ($userInput = <STDIN>);

 while ($line = <INPUT>)
 if ($line =~ /userInput/)
 print $line;

Я знаю, что это не идеально, но я только учусь.

Ответы [ 3 ]

2 голосов
/ 10 марта 2012

Вы были близки.Вам необходимо расширить переменную в сопоставлении с образцом.

print "Please Enter the word to find: ";
chomp ($userInput = <STDIN>);

while ($line = <INPUT>) {
    if ($line =~ /$userInput/) {  # note extra dollar sign
        print $line;
    }
}

Помните, что это совпадение с шаблоном, поэтому вы ищете строку, в которой потенциально могут быть символы подстановки.Если вам нужна литеральная строка, поместите \Q перед переменной при интерполяции: /\Q$userInput/.

1 голос
/ 10 марта 2012

Что-то вроде . \ bWORD \ b. может работать (не проверено)

print $line if ($line =~ /.*\bWORD\b/)

@ NewLearner

\b для границ слова

http://www.regular -expressions.info / wordboundaries.html

0 голосов
/ 10 марта 2012

Если вы выполняете только один цикл, использовать цикл 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...