2017-08-10 170 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'?你写的东西可以运行,但需要谨慎;除了NOTHING,你可能永远不会看到任何东西。特别是,你正在为每一行创建一个新的正则表达式 - 这可能不是你想要的。 –

+0

@JonathanLeffler是的,创建新的正则表达式是我的主要目的是从文本文件中获取它。但它没有匹配任何东西,即使它应该。 – Joey

+2

为什么它会匹配'驴'?正则表达式包含一个不在'$ items'字符串中的换行符,所以正则表达式永远不会匹配。即使你咬住了输入行,你也很少有'$ contents'匹配'donkey'。你可以键入'donkey'或'd..key'或类似的东西,但大多数情况下,运行的文本不会匹配'$ items'。如果你[写了一个寻找'驴'的原始'grep',那么你就有正则表达式:你需要'if($ contents =〜m/$ items /)'作为条件。你想要做什么的解释应该在问题中,以及简单的示例输入([MCVE]!)。 –

回答

1

是的,但你需要删除每行($contents =~ s/\n$//;)后时讯:

#!/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