我有以下简单的代码(被识别为代码问题并从更大的程序中提取)。
是我还是你能否在这段代码中看到一个明显的错误,它阻止它与$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 :(得分: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()”之前和之后打印,看看你得到了什么?这应该不是问题,但测试每个案例都没有坏处。