逐行读取文件迭代问题



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

是我还是你能在这段代码中看到一个明显的错误,它阻止了它与$variable匹配,并在它确实应该做的时候打印$found

当我尝试打印$variable时,不会打印任何内容,并且在我使用的文件中肯定有匹配的行。

代码:

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

我已经将其定位为错误发生的点,但无法理解为什么?可能有什么事情我完全忽略了,因为它已经很晚了?

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

$variable中可能有正则表达式元字符。线路

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

应该是

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

以逃避任何存在。

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

此外,您应该使用读取文件

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

因为CCD_ 6循环将不必要地将整个文件读取到存储器中。并且使用比$variable更好的名称。

这对我有用。我是不是错过了手头的问题?您只是想将"$Text"与文件中每行的任何内容相匹配,对吗?

#!/usr/bin/perl
use warnings;
use strict;
my $fh;
my $filename = $ARGV[0] or die "$0 filenamen";
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()"之前和之后打印,看看你得到了什么?这不应该是问题所在,但测试每个案例并没有坏处。。

相关内容

  • 没有找到相关文章

最新更新