2013-02-20 44 views
0

我有以下一段简单的代码(标识为问题代码片段并从一个更大的程序中提取)。逐行读取文件迭代问题

难道是我还是可以在代码中看到一个明显的错误,即它在停止匹配$variable和打印$found的时候肯定应该这样做?

当我尝试打印$variable时没有打印任何内容,而且我使用的文件中绝对存在匹配的行。

代码:

if (defined $var) { 
    open (MESSAGES, "<$messages") or die $!; 
    my $theText = $mech->content(format => 'text'); 
    print "$theText\n"; 
    foreach my $variable (<MESSAGES>) { 
     chomp ($variable); 
     print "$variable\n"; 
     if ($theText =~ m/$variable/) { 
      print "FOUND\n"; 
     } 
    } 
} 

我已经找到了这个为在该处发生异常,但不明白为什么了吧? 有些事我可以完全忽略,因为它已经很晚了?

+0

是否打印了$ theText? – Borodin 2013-02-21 00:38:16

+0

是的网页内容正在打印,我知道我的文本文件中的字符串是在内容中找到的,因为我在模式匹配中硬编码了字符串,并在内容中找到它 – 2013-02-21 00:43:16

+0

您应该尝试将文件读入一个数组,像'my @messages = ',然后你可以'打印标量@消息'来查看已经读了多少行。我认为这很可能是你拾取错误的文件,因为'$ messages'不包含你认为它所做的事情,或者因为它正在查找错误的目录。 – Borodin 2013-02-21 00:44:37

回答

4

更新我后来意识到我误解了你的问题,这可能不能解决问题。然而,这些观点是有效的,所以我将他们留在这里。

您可能在$variable中有正则表达式元字符。该生产线

if ($theText =~ m/$variable/) { ... } 

应该

if ($theText =~ m/\Q$variable/) { ... } 

逃避任何有。

但是你确定你不只想要eq

此外,你应该使用

while (my $variable = <MESSAGES>) { ... } 

for循环将不必要地将整个文件读入内存中读取文件。而使用比$variable更好的名字。

+0

+1:主要用于'while'的建议... – 2013-02-21 01:34:44

+0

感谢关于使用'while'的观点。我通常会这样做,我只是想尽一切办法让代码在这种情况下工作,谢谢你的帮助。 – 2013-02-21 16:43:15

+0

最后的问题是什么? – Borodin 2013-02-22 10:22:08

2

这对我有用..我是否错过了这个问题?你只是试图将“$ theText”与文件中每行的任何内容匹配吗?

#!/usr/bin/perl 

use warnings; 
use strict; 

my $fh; 
my $filename = $ARGV[0] or die "$0 filename\n"; 

open $fh, "<", $filename; 
my $match_text = "whatever"; 
my $matched = ''; 

# I would use a while loop, out of habit here 
#while(my $line = <$fh>) { 
foreach my $line (<$fh>) { 
    $matched = 
     $line =~ m/$match_text/ ? "Matched" : "Not matched"; 

    print $matched . ": " . $line; 
} 

close $fh 

./test.pl testfile 
Not matched: this is some textfile 
Matched: with a bunch of lines or whatever and 
Not matched: whatnot.... 

编辑:啊,我明白了。为什么不试试前和后打印“格格()”,看看你得到了什么?这应该不是问题,但它不会损害测试每个案例。

+0

+1:检查打开成功是个好主意,但三参数'open'和词法文件句柄是好的。名义上,你应该关闭你打开的那个。 – 2013-02-21 01:36:24

+0

@JonathanLeffler - 对,*总是*关闭你打开的文件。我总是在它打开的范围内关闭它们。 – chrsblck 2013-02-21 01:38:44

+1

仅供参考:因为如果您使用'打开我的$ fh,'<',$ filename'或等效代码,Perl会关闭该文件会在变量超出范围时自动执行。请参阅Perl文档中['open'](http://perldoc.perl.org/functions/open.html)末尾的信息。我倾向于明确地接近,但是我已经用Perl编写了20多年(不寒而栗),并且在某些时候这是必要的。 – 2013-02-21 01:50:40