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 に答える