· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ZEN —› Complex data types in Perl

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Авг 6, 2003 20:51:01

Да, это не усовершенствованный вариант!!!
Там ещё круто можно выиграть с переменными состояний
И сравнением в буфере алгоритмом отброса половины.
Классная вещь!!!

Вот например кое что:
Смотрите, вводим указатель, который указывает на место в кеше, где закончился путь ПОСЛЕДНего проанализированного элемента.
И следующий элемент сравниваем как раз с предыдущим, а потом решаем, куда идти вниз буфера, или вврех!!!


Дата: Авг 7, 2003 15:23:53 · Поправил: bsl_zcs

Господа, может быть меня неправильно поняли, но я никогда не позиционировал себя как "гуру перла". ГурОй быть скучно... ;)

2 volodya : Твоё решение вполне работоспособно.

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

Твой способ перебирания массива не слишком эффективен. Если ты не изменяешь количество элементов внутри самого этого цикла, на каждый элемент проверять существует ли он необязательно. Проще один раз взять количество элементов и выполнить цикл от нуля до него. А если индекс в массиве не используется в теле цикла, то намного эффективнее использовать foreach.

Ещё можно немного соптимизировать за счёт использования дефолтных переменных.

То есть, без "..." твой кусок мог бы выглядть так:
print join("\t", @$_),"\n" for @temp_array;

А в зависимости от этого "..." всё может быть совсем по-другому.

Насчсёт мануала: дык, perldoc perldsc - Perl Data Structures Cookbook. По русски ничего не посоветую, извини.

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

Примерно так:
push @ptr, 0;
push @buf, 1,2,3,4,5,6,7,8; 	push @ptr, scalar @buf;
push @buf, 1,2,3,4; 		push @ptr, scalar @buf;
push @buf, 3,4,5;    		push @ptr, scalar @buf;

print "@buf\n@ptr\n";

for($a=1; $a<@ptr; $a++)
{
	print join("\t", @buf[$ptr[$a-1]..$ptr[$a]-1]),"\n";
	...
}


А насчёт дикой неэкономичности того решения через хэш, ты всё-таки не прав.
Эффективность этого решения с увеличением уровня исходной избыточности только растёт. А у сортировки - падает, притом, существенно.

В хэш попадут только уникальные числа, а сортировать придётся все. И расход памяти заметно меньше.

Хэши в перле реализованы весьма эффективно, к тому же, они всегда уже есть, поэтому оверхед невелик. А вычислительная сложность той же сортировки сводит на нет преимущества простого последовательного устранения дупов.
Опять же, Edmond верно говорит: перл - интерпретатор, поэтому встроенные функции выполняются существенно быстрее, чем их эквивалент на перле.

Для таких целей, хеш имеет смысл применять даже там, где его от рождения нет. Например, на том же ассемблере. Разумеется, при достаточно серьёзных объёмах. Особенно, если работать со строками.

А на мелких объёмах, где производительность совершенно некритична, лично для меня, например, важнее размер исходника - количество кнопок, которые мне придётся нажать. Так что...


Дата: Авг 7, 2003 17:22:09 · Поправил: volodya

bsl_zcs

Спасибо. Я рад, что ты есть на этом форуме :)
Вот мое последнее решение:
	foreach (@temp_array)
	{
		print RINDEX "$rgid\t".join("\t", @$_)."\n";
	}



Дата: Авг 8, 2003 10:21:50

и свинье понятно
Опять свиней обижать?!!!
Ишь, мало им съесть нас, ещё надругаться надо!


Дата: Авг 8, 2003 11:19:56

The Svin
и свинье понятно

:))))))))


Дата: Авг 8, 2003 21:26:43 · Поправил: Asterix

Извините, я тут влезу с вопросом, а то не охота новую ветку создавать.
В перле символ '.' является спецсимволом, т.е. означает любой символ,
но мне нужно в тексте отыскать, например, '.endif' и заменить на
<b>.endif</b>, потом найти '.if' и сделать то же самое, как обойти
эту ситуацию с точкой????????????


Дата: Авг 8, 2003 22:33:38

Уже сам разобрался, просто я раньше пытался перед точкой ставить
обратный слэш '\', но почему-то не прокатывало...


Дата: Авг 8, 2003 23:13:06

Точку в regex просто замаскируй - ты совершенно прав\. \:)


Дата: Авг 8, 2003 23:21:09

Да я и маскировал, но что-то хотел больно хитро проделать, через
переменные и оно не понимало моих маскировок :-)


Дата: Авг 8, 2003 23:25:49 · Поправил: volodya

Для этих целей меня тащит тестер regex в OptiPerl. Согласно любимой фразе Four-F - IMHO - это самый крутой regex-тестер.
Откуда достать поломанный OptiPerl ты знаешь :) Кстати, программа защищена почти последней версией armadillo %0


Дата: Авг 9, 2003 00:49:04

[ volodya: Кстати, программа защищена почти последней версией armadillo %0]

Вот поэтому я никак до неё не доберусь, немного посмотрел и плюнул,
ну её нафиг, у меня 98-я винда из под OptiPerl улетает даже при обычном
запуске проги, не говоря уже про запуск под SoftIce...
Поломанное не мной не очень люблю...
А что та поломанная версия нормально работает?, кто-то жаловался
что вроде глючит...

p.s. ещё такой вопрос, как парсить строки без учёта регистра,
можно конечно порыться посмотреть, но спросить ведь всегда проще ;-)


Дата: Авг 9, 2003 18:30:49

Ну, лентяй. Просто феноменальный!
В перле есть разные способы, например, так:

/PATTERN/i
т.е.
/vasya/i
найдет в $_ и vasya и vAsYa

попробуй, например, также и диапазон -
[(a-z).*] - строчные буквы латинского алфавита и т.д., и т.п.


Дата: Авг 9, 2003 18:37:19 · Поправил: Asterix

Спасибо. Про эту /i я уже вычитал :) но не получилось применить,
наверное не умею...
Делал типа /\U$search\E/ , но только для одной конкретной переменной.


Дата: Авг 9, 2003 19:32:29

А что та поломанная версия нормально работает?, кто-то жаловался

У меня 2k и все работает как часики!

Спасибо. Про эту /i я уже вычитал :) но не получилось применить

О опыт, сын ошибок трудных...
Разберешься! Куда ж ты с подводной лодки денешься!
А optiperl все-таки попробуй!
А-то и вообще - сливай Komodo и учись управлятся с его монструозным чекером. Хотя там мне просто страшно становится от одного взгляда на сие творение!


Дата: Авг 9, 2003 20:45:24

А что Комодо круче? Просто его проще надыбать зарегенного...

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076