2012-03-10 5 views
1

私はLOGファイルを読むためのスクリプトを書いています。私は、単語を入力してからそれを探し、単語にマッチする行(文字列から)を印刷したいと思っています。Perl正規表現:ユーザが入力した単語をファイル内で見つける方法

私はちょうどPerlを学んでいるので、私はそれを理解することができるように非常に具体的で簡単です。

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

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

私はこれが完璧ではないことを知っていますが、私は学んでいます。

+2

ユーザ入力が 'dog'、あなたがしたい場合はB \

はワード境界のためである

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

@NewLearner(それがテストされていません。汝)うまくいくかもしれません'dogs'と' odograph'などとマッチしますか? – pilcrow

+0

Nopファイルログで探している単語に一致させたい。 IPを入力すると、IPワードを持つ行を見つけてその行に画面に出力したいと思う。 – NewLearner

+0

あなたはいつも 'grep word file'を実行できます。あなたが 'man grep'を読んだら、使える多くの機能があることがわかります。 – TLP

答えて

2

あなたは近くにいました。パターンマッチで変数を展開する必要があります。

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/)。

+0

ありがとう、これは私にエラーが発生します。 – NewLearner

+1

@NewLearnerどのようなエラーがありますか? INPUTが開いているファイルハンドルであると仮定しているので、あなたのプログラムにはそれ以上のものがあると思います。 – tchrist

+0

コードが動作します。 –

0

ループを1回だけ実行している場合は、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; 
} 
+0

ファイル全体を一度にメモリに読み込まないでください。答えは – tchrist

1

のようなものです。 \ bWORD \ b。

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

+0

ありがとうございます。そのコードの中でbは何をしますか? – NewLearner

+0

@NewLearner:Perlは、コマンドラインで利用可能なドキュメント、 'perldoc perlrequick'を提供しています。また、http://perldoc.perl.org/perlrequick.htmlからオンラインで入手できます。 – toolic

+0

英数字の文字列を入力したかどうかわからない場合は、 '\ b'を使用できません。文字列に '%'を入力するとどうなるか想像してみましょう:あなたは今、パーセント記号の隣に英数字を強制します! '\ b'は、英数字に触れているときに期待していることだけを実行することになることを覚えておいてください。 – tchrist

関連する問題