2013-02-20 3 views
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"; 
     } 
    } 
} 

Я находится это как точка, в которой ошибка происходящей, но не может понять, почему? Может быть, что-то, что я полностью игнорирую, поскольку его очень поздно?

+0

Печатается ли '$ TheText'? – Borodin

+0

Да, содержимое веб-страницы печатается, и я знаю, что строка в текстовом файле находится в содержимом, поскольку я жестко закодировал строку в совпадении с шаблоном и нашел ее в содержимом –

+0

. Вы должны попробовать прочитать файл в массив, например 'my @messages = ', и вы можете« распечатать скалярные @ сообщения », чтобы узнать, сколько строк было прочитано. Я думаю, что, скорее всего, вы собираете неправильный файл, потому что '$ messages' не содержит того, что вы думаете, или потому, что он ищет неправильный каталог. – Borodin

ответ

4

Обновление С тех пор я понял, что неправильно излагаю ваш вопрос, и это, вероятно, не решит проблему. Однако точки действительны, поэтому я оставляю их здесь.

У вас, вероятно, есть метасимволы регулярного выражения в $variable. Линия

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

должен быть

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

, чтобы избежать какой-либо, что есть.

Но вы уверены, что не хотите eq?

Кроме того, вы должны прочитать из файла, используя

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

как for цикла будет излишне читать весь файл в память. И , пожалуйста, используйте лучшее имя, чем $variable.

+0

+1: прежде всего для совета 'while' ... –

+0

спасибо за вопрос об использовании' while'. Я обычно, я просто пытался что-нибудь получить код для работы в этом случае, спасибо за вашу помощь. –

+0

В чем была проблема в конце? – Borodin

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.... 

Edit: Ах, я вижу .. Почему бы вам не попробовать печати до и после «Chomp()» и посмотреть, что получится? Это не должно быть проблемой, но это не мешает тестировать каждый случай.

+0

+1: Было бы неплохо проверить, что открытое выполнено успешно, но три аргумента 'open' и лексические дескрипторы файлов хороши. Номинально, вы должны закрыть то, что вы открываете. –

+0

@JonathanLeffler - Правильно, * всегда * закрывайте открытые файлы. Я всегда закрываю их в том же объеме, в котором он был открыт. – chrsblck

+1

FYI: Я сказал «номинально», потому что если вы используете 'open my $ fh, '<', $ filename' или эквивалент, например, в вашем коде, Perl закрывается файл автоматически, когда переменная выходит за рамки. См. Информацию в самом конце ['open'] (http://perldoc.perl.org/functions/open.html) в документации Perl. Я стараюсь, чтобы явное закрытие, но я программировал Perl для (содрогания) более 20 лет, и в течение некоторого времени это было необходимо. –

Смежные вопросы