逐行读取文件迭代问题

时间:2013-02-20 23:48:55

标签: perl file for-loop

我有以下简单的代码(被识别为代码问题并从更大的程序中提取)。

是我还是你能否在这段代码中看到一个明显的错误,它阻止它与$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";
        }
    }
}

我已将此定位为发生错误但无法理解原因的点? 因为它很晚才可能有一些我完全忽略的东西?

2 个答案:

答案 0 :(得分:4)

更新我已经意识到我误解了您的问题,这可能无法解决问题。但是这些要点是有效的,所以我将它们留在这里。

您可能在$variable中有正则表达式元字符。这条线

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

应该是

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

逃避现有的任何事情。

但你确定你不只是想要eq吗?

此外,您应该使用

从文件中读取
while (my $variable = <MESSAGES>) { ... }

作为for循环将不必要地将整个文件读入内存。并且使用比$variable更好的名称。

答案 1 :(得分: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....

编辑:啊,我明白了..为什么不尝试在“chomp()”之前和之后打印,看看你得到了什么?这应该不是问题,但测试每个案例都没有坏处。