LINUX.ORG.RU

локализация и мультистрочный поиск в PERL


0

0

такая проблема, никак не могу сделалть локализацию и самое главное - мультистрочный поиск в PERL для кодировки cp866 (dos кирилик). Делаю вот так: while(<*.txt>){open(IN,"$_"){ while(<IN>){print /конец строки\s?\r?\n?начало новой/gsm} } но мультисточник не срабатывает. Пробовал вот так: use encoding 'cp866'; while (<*.txt>) { open my $IN, '<:encoding(cp866)', $_ or die $!; local $/; $_ = <$IN>; print if /конец строки\s?\r?\n?начало новой/gsm; } т.е. забираем весь файл в переменную. Таким образом маленькие файлы открываются (правда теряется возможность использовать работу с отдельными строками), а вот большие файлы-"склейки" по 50-100 mb в - в консоли пишутся, но в OUT-файл не записываются. Просто загружается процессор, отбирается память, создается OUT файл, идет какой-то нескончаемый процесс, но OUT файл остается нулевым. Видно нельзя в одной переменной хранить по 100 mb текста.. вот ссылка на файлик (маленький) с этой кодировкой http://www.sql.ru/forum/actualfile.aspx?id=5084568 если у кого-то получится сделать мультистрочный поиск в нем без - дайте знать, пожалуйста!

anonymous

чегото типа этого:

#!/usr/bin/perl -w

use strict; open F "<dos.txt" or die "cannot open: $!"; my @m=<F>; Close F

my @koi = grep {dos2koi($_)} @m;

my $txt.=$_ foreach @koi;

sub dos2koi { my $str = shift; $str =~ tr[\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92 \x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6 \xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA \xEB\xEC\xED\xEE\xEF\xF0\xF1][\xE1\xE2\xF7\xE7\xE4\xE5\xF6\xFA\xE9\xEA\xEB\xEC\x ED\xEE\xEF\xF0\xF2\xF3\xF4\xF5\xE6\xE8\xE3\xFE\xFB\xFD\xFF\xF9\xF8\xFC\xE0\xF1\x C1\xC2\xD7\xC7\xC4\xC5\xD6\xDA\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD2\xD3\xD4\xD5\x C6\xC8\xC3\xDE\xDB\xDD\xDF\xD9\xD8\xDC\xC0\xD1\xB3\xA3]; return $str; }

vilfred ☆☆
()

> Делаю вот так: (...) но мультисточник не срабатывает.

(что вполне логично — с ним сравнивается _одна_ строка файла)

> вот ссылка на файлик (...) если у кого-то получится сделать
> мультистрочный поиск в нем (...)

Ссылка с проверкой refererr'а? Дащазсразуужепобежал.

Вот простой вариант для заранее известного NLINEMATCH:

-------------------------------------------------------------------------------

#!/usr/bin/perl

use encoding 'utf-8';

$NLINEMATCH = 2;

binmode(STDOUT, ":locale");
foreach $file (glob("*.txt")) {
	open(FILE, "<:crlf:encoding(cp866)", $file)
		|| die "Can't open $file: $!\n";
	while(<FILE>) {
		shift @last if @last >= $NLINEMATCH;
		push @last, $_;
		$chunk = join('', @last);
		print "Match: $1\n" if $chunk =~ /(1\nСтрока)/sm;
	}
}
-------------------------------------------------------------------------------


Общее решение сделать можно (см. напр. pcrepartial(3)), но оно сложнее и скорее
всего нафик тут не сдалось.

alexs
()
Ответ на: комментарий от alexs

первый ответ - я попробавал так, из но мультипоиск так и не заработал.. второй ответ - если честно, я не совсем понял эту конструкцию. Мне просто необходим простой доступ к данным . вроде while(<IN>){do smth} или foreach (@IN){do smth} . т.к. нужно очень много поисков/замен делать и других штук с большим кол-вой файлов. . т.е. в итоге получается мультистрочный работает только при чтении даннхы не построчно а из переменной. Но если текст огромный, то в переменную нельзя записать. Может как-то можно разбить текст на абзацы и абзацы записать в переменные а их поместить в массив?..

anonymous
()
Ответ на: комментарий от anonymous

> т.е. в итоге получается мультистрочный работает только при чтении даннхы не построчно а из переменной. Но если текст огромный, то в переменную нельзя записать. Может как-то можно разбить текст на абзацы и абзацы записать в переменные а их поместить в массив?..

Фрагмент выше как раз разбивает текст на куски по $NLINEMATCH строк и натравливает на них регэксп. Для этого нужен массив размером всего $NLINEMATCH элементов вместо `wc -l исходный-файл`. Только куски там перекрывающиеся, т.е. s1s2, s2s3, s3s4, ..., где si — i-я строка и NLINEMATCH=2.

Разбиение на абзацы м.б. даже лучше, если конечно в файле есть абзацы и известно как их выделять. Массив там не нужен, считали один абзац — обработали — забыли — считали следующий и т.д.

alexs
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.