Мечу perl перед собою
Jan. 6th, 2012 04:16 amТри дня читал я три книги, но понял пока только, как сделать следующее.
my $file = get("некий адрес в сети");
open (TEST, ">test.txt");
print TEST "$file";
close TEST;
Почему-то пока не могу никакими силами заставить читать получившийся файл построчно и искать / заменять в нем какие-то паттерны. Подозреваю, что мне вообще не нужно ничего сохранять ни в какой файл (можно работать прямо с результатами get), но так я хоть вижу, что у меня что-то получается (в директории появляется новый файл, радующий глаз).
Должно быть, я не понимаю чего-то совсем простого. Хорошо бы понять, чего именно. Кто бы вправил мне мозги по теме?
no subject
Date: 2012-01-06 12:30 am (UTC)http://www.amazon.com/Perl-Cookbook-Second-Tom-Christiansen/dp/0596003137/ref=dp_ob_title_bk
В простораx интернета наверняка можно найти и электрическую версию.
там подобного рода вещи как раз подробно разъяснены. Скажем, глава про содержимое файлов имеет подглавки:
Introduction
Reading Lines with Continuation Characters
Counting Lines (or Paragraphs or Records) in a File
Processing Every Word in a File
Reading a File Backwards by Line or Paragraph
Trailing a Growing File
Picking a Random Line from a File
Randomizing All Lines
Reading a Particular Line in a File
Processing Variable-Length Text Fields
Removing the Last Line of a File
Processing Binary Files
Using Random-Access I/O
Updating a Random-Access File
Reading a String from a Binary File
Reading Fixed-Length Records
Reading Configuration Files
Testing a File for Trustworthiness
В вашем конкретно случае можно, читая файл, делать так:
запускаете perl myprog.pl < test.txt
while(<>){
# что-то делаете со строкой
}
no subject
Date: 2012-01-06 01:05 am (UTC)no subject
Date: 2012-01-06 01:11 am (UTC)http://okular.kde.org/formats.php
no subject
Date: 2012-01-06 01:39 am (UTC)no subject
Date: 2012-01-06 01:47 am (UTC)xchm
chmsee
gnochm
kchmviewer
chm2pdf
Первые две полегче, последняя — чтобы конвертировать из chm в pdf.
Запускать хоть в терминале, а просмотрщики должны и просто в контекстном меню к файлу в файловом менеджере появиться.
no subject
Date: 2012-01-06 01:07 am (UTC)no subject
Date: 2012-01-06 01:46 am (UTC)while(<>){
s/this/that/ig;
print;
}
no subject
Date: 2012-01-06 02:00 am (UTC)Конструирование сложного паттерна -- отдельный вопрос.
Самое поразительное в перле -- ассоциативные массивы (xэши). Когда я понял, что они такое, у меня челюсть упала на пол.
например, следующий код - функциональная программа, считающая частоту слов в стандартном вxоде:
# Make a word frequency count
%seen = ();
while (<>) {
while ( /(\w['\w-]*)/g ) {
$seen{lc $1}++;
}
}
# output hash in a descending numeric sort of its values
foreach $word ( sort { $seen{$b} <=> $seen{$a} } keys %seen) {
printf "%5d %s\n", $seen{$word}, $word;
}
Цитата на этот счет:
Doing linear scans over an associative array is like trying to club someone to death with a loaded Uzi.
no subject
Date: 2012-01-06 07:03 pm (UTC)no subject
Date: 2012-01-06 09:22 pm (UTC)no subject
Date: 2012-01-06 01:25 am (UTC)$ curl -s http://www.vvk.ee/varasemad/kov09/osavott/osavott.html |\ sed -n '/y">VP/{N;N;s!\n!;!g;s!<[^<]*\(VP.\|/td>\)!!g;s!\(.*\)!City;\1!p};/area"/{s!.*sp;\([^<]*\).*!\1!;h;n;n;n;g;N;N;N;s!<.\?td>!!g;s!\n!;!g;s! !!g;p}' City;12:00;16:00;20:00 Harju maakond;34,6;53,0;64,07 Hiiu maakond;35,6;49,2;56,45 Ida-Viru maakond;28,5;47,2;57,92 Jõgeva maakond;38,6;53,8;62,26 Järva maakond;34,6;49,3;57,33 Lääne maakond;35,3;50,1;58,88 Lääne-Viru maakond;31,1;46,5;56,30 Põlva maakond;38,0;52,8;61,76 Pärnu maakond;30,7;47,6;56,28 Rapla maakond;30,5;45,8;55,68 Saare maakond;33,6;45,6;53,02 Tartu maakond;33,7;50,3;60,13 Valga maakond;34,9;50,6;59,53 Viljandi maakond;31,7;46,8;55,17 Võru maakond;35,9;50,5;61,12 Tallinn;31,8;53,5;65,74 Tartu linn;28,0;44,5;54,42 E-HÄÄLI;;; KOKKU;32,1;50,1;60,57То же самое можно и более человеческими методами, что perl, что awk. Но так смешнее и инфернальнее получается :)
no subject
Date: 2012-01-06 01:31 am (UTC)no subject
Date: 2012-01-06 08:55 am (UTC)Кроме того, у меня этих URL более 500 шт. Согнать их в один текстовый файл (каждая строка -- 1 URL) я могу при помощи веревочной петли и палки, но ходить на них, по очереди пихая в командную строку, ничуть не легче, чем просто посетить их все по очереди и скопировать таблицы руками.
no subject
Date: 2012-01-06 09:18 am (UTC)составлю Вам заклинание.
no subject
Date: 2012-01-06 01:47 am (UTC)$text=file_get_contents($url);
$text=preg_replace(... , ... ,$text);
$file=fopen("file.txt","w+");
fwrite($file, $text);
fclose($file);
подозреваю, что на перле это очень похоже
в любом случае, на никсе пхп-вариант должен быть не проблемой =)
no subject
Date: 2012-01-06 04:53 am (UTC)open (INPF, 'myfile') || die ; while (<INPF>){ ($x,$y) = split ',', $_; # в переменной $_ находится считанная строка $f{$x} = $y; # в данном случае пара значений аргумент и функция, разделенные запятыми } close INPF;А так можно прочитать файл и заменить все что нужно одним чохом
no subject
Date: 2012-01-06 06:56 pm (UTC)no subject
Date: 2012-01-06 10:03 am (UTC)Можно
download.file()
затем
gsub() или что-то в этом роде. Ну и дальше уже обработка.
===
Для чтения CHM под Linux оказался очень полезен ChmFox.