kouprianov: (Default)
[personal profile] kouprianov

Три дня читал я три книги, но понял пока только, как сделать следующее.

my $file = get("некий адрес в сети");
open (TEST, ">test.txt");
print TEST "$file";
close TEST;

Почему-то пока не могу никакими силами заставить читать получившийся файл построчно и искать / заменять в нем какие-то паттерны. Подозреваю, что мне вообще не нужно ничего сохранять ни в какой файл (можно работать прямо с результатами get), но так я хоть вижу, что у меня что-то получается (в директории появляется новый файл, радующий глаз).

Должно быть, я не понимаю чего-то совсем простого. Хорошо бы понять, чего именно. Кто бы вправил мне мозги по теме?

Date: 2012-01-06 12:30 am (UTC)
From: [identity profile] anatol-olegych.livejournal.com
Лучшая книга по перлу (на мой вкус) -- Perl cookbook
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(<>){
# что-то делаете со строкой
}

Date: 2012-01-06 01:05 am (UTC)
From: [identity profile] kouprianov.livejournal.com
Нашел только первое в PDF. Второе в .CHM, но не ставить же из-за этого Windows? Интересно, под линуксом можно как-то .CHM прочесть?

Date: 2012-01-06 01:11 am (UTC)
From: [identity profile] sergey-adept.livejournal.com
Ну, у меня Okular открывает .chm, ссылки правда не работают.

http://okular.kde.org/formats.php

Date: 2012-01-06 01:39 am (UTC)
From: [identity profile] anatol-olegych.livejournal.com
если, xотите, киньте мне в личку письмо, я вам могу отправить полезный файл в HTML

Date: 2012-01-06 01:47 am (UTC)
From: [identity profile] ishc.livejournal.com
$ sudo apt-get install на выбор:

xchm
chmsee
gnochm
kchmviewer
chm2pdf

Первые две полегче, последняя — чтобы конвертировать из chm в pdf.

Запускать хоть в терминале, а просмотрщики должны и просто в контекстном меню к файлу в файловом менеджере появиться.

Date: 2012-01-06 01:07 am (UTC)
From: [identity profile] kouprianov.livejournal.com
Ну, я и пытаюсь #что-то делать со строкой. # выходит из всех этих попыток, пока что.

Date: 2012-01-06 01:46 am (UTC)
From: [identity profile] anatol-olegych.livejournal.com
# will change "this" into "that" in each line of input, if any, and print them all out
while(<>){
s/this/that/ig;
print;
}

Date: 2012-01-06 02:00 am (UTC)
From: [identity profile] anatol-olegych.livejournal.com
Это вполне работающий код, но паттерны фиксированные, т.е. это просто замена.
Конструирование сложного паттерна -- отдельный вопрос.

Самое поразительное в перле -- ассоциативные массивы (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.

Date: 2012-01-06 07:03 pm (UTC)
From: [identity profile] kouprianov.livejournal.com
Да, у меня внезапно начало получаться с фиксированными паттернами. Сейчас думаю над более сложной задачей с вариабельными паттернами (и мне нужна не столько замена, сколько вылавливание данных из одних таблиц и переформатирование в немного другие таблицы.

Date: 2012-01-06 09:22 pm (UTC)
From: [identity profile] anatol-olegych.livejournal.com
Cookbook вам поможет. Но паттерны очень xитрая штука. Я всегда действую способом пробок и ошибок.

Date: 2012-01-06 01:25 am (UTC)
From: [identity profile] ishc.livejournal.com
Строго говоря, перл тут может быть и вообще не нужен, вроде пушки для воробьёв. Вот, например, вспомнил язык Ктулху и вытащил данные по недавним муниципальным выборам в Эстонии, в формате CSV, разделитель точка с запятой, в таблице приведён процент проголосовавших на указанный час в городах и муниципалитетах:

$ 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!&nbsp;!!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. Но так смешнее и инфернальнее получается :)

Date: 2012-01-06 01:31 am (UTC)
From: [identity profile] ishc.livejournal.com
то, что после «$» в первой-второй строке, это в смысле просто в терминале можно ввести :)

Date: 2012-01-06 08:55 am (UTC)
From: [identity profile] kouprianov.livejournal.com
Ты смеешься надо мной, проклятый колдун! И рад бы вспомнить язык Ктулху, но я его никогда не знал.

Кроме того, у меня этих URL более 500 шт. Согнать их в один текстовый файл (каждая строка -- 1 URL) я могу при помощи веревочной петли и палки, но ходить на них, по очереди пихая в командную строку, ничуть не легче, чем просто посетить их все по очереди и скопировать таблицы руками.

Date: 2012-01-06 09:18 am (UTC)
From: [identity profile] ishc.livejournal.com
дайте же мне эти урлы или хотя бы скажите где я их могу взять :)

составлю Вам заклинание.

Date: 2012-01-06 01:47 am (UTC)
From: [identity profile] ralfer.livejournal.com
будучи старым php-шником, могу предложить
$text=file_get_contents($url);
$text=preg_replace(... , ... ,$text);
$file=fopen("file.txt","w+");
fwrite($file, $text);
fclose($file);
подозреваю, что на перле это очень похоже
в любом случае, на никсе пхп-вариант должен быть не проблемой =)

Date: 2012-01-06 04:53 am (UTC)
From: [identity profile] vlkamov.livejournal.com
 open (INPF, 'myfile') || die ;
 while (<INPF>){
   ($x,$y) = split ',', $_; # в переменной $_ находится считанная строка
   $f{$x} = $y; # в данном случае пара значений аргумент и функция, разделенные запятыми
 }
 close INPF;



А так можно прочитать файл и заменить все что нужно одним чохом

 $/="ЪЪЪ"; # разделитель строк - последовательность, которой явно нет в файле
 open (INPF, 'oldfile') || die ;
 $_ = <INPF> ; # весь файл в переменную $_
 close INPF;
 $/="\n"; # восстанавливаем разделитель строк
 $_ =~ s/абв/бва/g; # заменяем все
 open (OUTF, '> newfile') || die ;
 print OUTF $_; # пишем новый файл 
 close OUTF;

Date: 2012-01-06 06:56 pm (UTC)
From: [identity profile] kouprianov.livejournal.com
Ха. Внезапно начало получаться. То есть, наконец удалось заставить делать глобальные замены. Пытаюсь теперь попробовать поиск и вытягивание данных через matching, но что-то я, видимо, пока не вполне понимаю, не то в синтаксисе регулярных выражений, не то в том, куда перл пихает данные после матчинга.

Date: 2012-01-06 10:03 am (UTC)
From: [identity profile] ashipunov.myopenid.com (from livejournal.com)
А зачем учить несколько языков, когда можно учить один? Ведь все равно обрабатывать в R.
Можно
download.file()
затем
gsub() или что-то в этом роде. Ну и дальше уже обработка.
===
Для чтения CHM под Linux оказался очень полезен ChmFox.

March 2025

S M T W T F S
      1
2345678
910 1112131415
16171819202122
23242526272829
3031     

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 22nd, 2026 07:15 pm
Powered by Dreamwidth Studios