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";
        }
    }
}

我已将此定位为错误发生的点,但不明白为什么?可能有一些我完全忽略的东西,因为它很晚?

4

2 回答 2

4

更新我已经意识到我误读了你的问题,这可能不能解决问题。但是这些点是有效的,所以我把它们留在这里。

您可能在$variable. 线

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

应该

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

逃避任何存在的东西。

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

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

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

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

于 2013-02-21T00:25:46.270 回答
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()”之前和之后打印,看看你得到了什么?这不应该是问题,但是测试每个案例并没有什么坏处。

于 2013-02-21T01:27:05.210 回答