2017-08-10 12 views
0

は、ここに私のコード正規表現を変数で照合することはできますか?

my $filename = 'text.log'; 

my $items = "donkey"; 

open(my $fh, '<:encoding(UTF-8)', $filename) or die "Cant open"; 

while (my $contents = <$fh>) 
{ 
     print "$contents"; 

     if ($items =~m/$contents/)    
      { print "Found $contents";}    
     else { print "NOTHING\n";} 
} 
+0

あなたを行うとあなたは 'Found $ contents'を印刷すると思いますか?あなたが書いたものは動くことができますが、注意が必要です。あなたはおそらく何も見ていないでしょう。特に、各行に対して新しい正規表現を作成しています。これはおそらくあなたが意図するものではありません。 –

+0

@JonathanLefflerええ、新しい正規表現を作成することは、テキストファイルからそれを取得する私の主な目的です。しかし、それは何かに合っていませんでした。 – Joey

+2

なぜ「ろば」と一致するのですか?正規表現に '$ items'文字列にない改行が含まれているので、正規表現は決してマッチしません。入力行を圧縮しても、 'donkey'と一致する' $ contents'はほとんどありません。 'donkey'や 'd..key'などを入力することもできますが、実行中のテキストは' $ items'と一致しません。あなたが 'donkey'を探し回っているプリミティブ' grep'を書いているならば、正規表現を前に持っています。条件として 'if($ contents =〜m/$ items /)'が必要です。あなたがやろうとしていることの説明は、単純なサンプル入力([MCVE]!)とともに問題になるはずです。 –

答えて

1

はい。ですが、各行($contents =~ s/\n$//;)に末尾newspaceを削除する必要があります:

#!/usr/bin/env perl 
my $filename = 'text.log'; 
my $items = "donkey"; 
open(my $fh, '<:encoding(UTF-8)', $filename) or die "Cant open"; 
while (my $contents = <$fh>) { 
    print "$contents"; 
    $contents =~ s/\n$//; 
    if ($items =~ m/$contents/) { 
     print "Found $contents\n"; 
    } else { 
     print "NOTHING\n"; 
    } 
} 

テスト:

$ cat text.log 
test 
ok 
donk 
$ ./test.pl 
test 
NOTHING 
ok 
NOTHING 
donk 
Found donk 
+2

'chomp $ contents;' –

+0

おかげで皆さん、ロック – Joey