2013-03-24 2 views
0

Я использую пакет Perl WWW::Mechanize для извлечения и обработки данных с некоторых веб-сайтов. Обычно мой способ действия заключается в следующем:Обработка текста внутри переменной перед записью в файл

  1. Fetch веб-страницу

    $mech->get("$url");

  2. Сохранить содержимое веб-страницы в переменной (кстати, я не уверен, что это правильный путь сохранить этот объем текста внутри скаляр, который, насколько я знаю, предполагается использовать для одного значения)

    my $list = $mech->content();

  3. Используйте подпрограмму, которую я создал, чтобы записать содержимое переменной в текстовый файл. (The writetoFile подпрограммой включает в себя несколько функций, таких как пути и существующие валидаций файлов ..)

    writeToFile("$filename.tmp","$path",$list);

  4. Обработка текста в файл, созданный в предыдущем шаге, создав дополнительный файл и сохранить его обработанный содержание там (Затем удаление начального временного файла).

Что интересно, о, есть ли возможность осуществлять обработку перед сохранением текста в файле, непосредственно внутри переменной $list? Весь процесс работает так, как ожидалось, но мне не очень нравится логика, и это кажется немного неэффективным, так как мне приходится переписывать один и тот же файл несколько раз.

EDIT: Просто для получения дополнительной информации о том, что я на самом деле после обработки содержимого переменной. Таким образом, данные, которые я извлекаю с веб-сайта в этом случае, на самом деле представляют собой список элементов, разделенных пустой строкой, и первая строка для меня не имеет значения. Так что я делаю во время обработки этих данных составляют 2 вещи:

  1. Удалить пустой (CRLF) линии
  2. Удалите первую строку, если она включает в себя конкретный текст.

В идеале я хочу сохранить обработанный список (без пробелов и первой строки) в файле без создания каких-либо дополнительных файлов в пути. Чтобы сохранить файл, я хотел бы использовать writeToFile sub (я написал), так как он также выполняет проверку того, существует ли такой файл (если файл будет сохранен до окончательной обработки - writeToFile всегда будет переписывать существующий файл).

Надеюсь, что это имеет смысл.

+0

Конечно, это так. Что именно вы не управляете? – Mat

+0

@Mat Hi. Моя проблема, по-видимому, заключается в том, что вы читаете текст внутри переменной по строкам и выполняете каждую строку текста в соответствии с некоторыми условиями, а затем сохраняете результат где-то .. так же, как я делаю это с файлом. С файлом I я читаю каждую строку, проверяю каждую строку и записываю обработанный вывод в другой файл. Спасибо. –

+1

Посмотрите ответы здесь: http://stackoverflow.com/questions/1445426/how-can-i-process-a-multi-line-string-one-line-at-a-time-in-perl-with -use-strict, особенно http://stackoverflow.com/a/1445732/635608 – Mat

ответ

1

Вы ищете split. Структура зависит: используйте (?<=\n), разделив на новый символ линии и сохраните его. Если это не имеет значения, используйте \R, чтобы включить все виды разрывов строк.

foreach my $line (split qr/\R/, $mech->content) { 
    … 
} 

Теперь обязательно HTML-синтаксический-с-регулярное выражение увещевание: если вы получаете источник HTML с Mechanize, разбор его построчно-линии не имеет особого смысла.Вероятно, вы захотите обработать HTML-лишенную версию документа text или передать исходный код HTML в парсер, например Web::Query, чтобы декларативно получить нужные фрагменты.

+0

Благодарим вас за ответ. Я смог включить ваше предложение в свой код. Но не могли бы вы объяснить этот шаблон 'qr/\ R /'. Вы упомянули, что '\ R' - это шаблон для разрыва строки, но как насчет' qr'? Спасибо –

+1

http://p3rl.org/rebackslash#%5cR http://p3rl.org/qr http://p3rl.org/op#qr%2fSTRING%2fmsixpodual Оператор 'qr' создает шаблон. Первый аргумент 'split' - это шаблон. – daxim

+0

Большое спасибо за ссылки и объяснения! –