![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
Гость_Kris |
|
|||
Unregistered |
Сабж - если файл разросся до слишком больших размеров требуется удалить первую
(соответственно самую старую) запись (строку). Вопрос- можно ли это сделать не переписывая данные в массив или во временный файл?? ![]() |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 1 Всего: 40 |
нет
|
|||
|
||||
Kiber_rat |
|
||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: нет Всего: 9 |
Вот пример... Массив не нужен, но временная переменная нужна
![]()
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||
|
|||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
А вообще это нужно изначально продумывать, ещё перед тем как файл разросся. Например держать в файле только последние 200 строк, всё остальные писать в архив. Допустим добавляется 201 строка, то первая выдёргивется и пишется в архив. Тогда можно и массивом воспользоваться. Кстати а строки какой длины? Может стоит подумать над тем что бы заюзать DBM?
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Гость_Kris |
|
|||
Unregistered |
Почему-то не работает (после первой записи 4 байт данные в файл не добавляются)
![]() Строка запроса http://www.host-n-one.com/cgi-bin/form.cgi?b=%ff%ff%ff%f0
|
|||
|
||||
Kiber_rat |
|
|||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: нет Всего: 9 |
А можно узнать что ты пытаешься сделать? Кроме того, почему не пользуешься модулем CGI? Пример который я писал годится для строк, а тебе, похоже, нужно побайтово работать, тогда используй seek что бы задать позицию с которой нужно читать. Вобщем опиши задачу, тогда будет легче написать пример.
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
|||
|
||||
Гость_Kris |
|
|||
Unregistered |
Да собственно нужен такой массив каждый элемент в котором это четырехбайтовое число.
Массив хранится в файле и при достижении некоторого числа элементов, скажем 1000, самая старая (первая) запись просто стирается, а новая добавляется в конец этого массива. Ну еще желательно проверять перед записью наличие элемента с таким значением в массиве-если имеется, то ничего не записываем и выходим. Странно, но проверка вроде-бы работает, несмотря на то что строки файла собственно и не строки, а четырехбайтные числа.... Передаем число на сервер -> http://www.host-n-one.com/cgi-bin/form.cgi...rd=%ff%12%21%ff
А вот убрать первую запись (если число элементов > n) из файла не получается ![]() Я в Perl совсем зеленый , не знаю что в нем является строкой - m-байтная двоичная последовательность это строка? Или строка должна иметь какой-то символ ограничитель? Какая минимальная длина строки? Максимальная? Может ли строка содержать любые символы от 00 до FF или нет? |
|||
|
||||
sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 3 Всего: 28 |
Строка - это все что в кавычках двойных или одинаковых, число может использоваться тоже как строка, все зависит от контекста. Perl сам определяет строка здесь или число.
Никаких ограничителей у строки нет, только - размер оперативной памяти. ![]() Минимальная длина строки - длина пустой строки = 0.
да, строка может содержать все что угодно, на то она и строка. ![]() Это сообщение отредактировал(а) sharq - 19.11.2005, 00:08 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Файл открывай как для чтения, так и для записи. Читай блоками байтов, а не строками. Вот тебе пример c коментариями.
Только в данном случае параметр получаем из командной строки, это я сделал для более легкого тестирования.
Только +< не создаёт файла, потому тебе нужно будет создать, пустой, файл самому. Затем настрой первые 3 переменные. Из командной строки передавай параметр: C:\>perl test.pl ffff C:\>perl test.pl xxxx C:\>perl test.pl aaaa И так далее. В файле будет сохранено максимум $max_block блоков, если если блоков больше или равно, то первая запись будет удалена, а новая запись будет добавлена в конец. Если переданный параметр уже есть, то он не будет сохранён повторно. Я не блокировал файл, но в конечной программе это нужно будет сделать. Не знаю это то, что тебе нужно или нет. Вобщем пробуй. Если что-то будет не ясно, пиши. Это сообщение отредактировал(а) korob2001 - 19.11.2005, 02:41 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Kiber_rat |
|
||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: нет Всего: 9 |
По порядку. Строкой, при чтении из файла по крайней мере, считается последовательность символов ограниченная символом перевода строки (\n). Далее, то что ты хочешь хранить в этом файле? Я так понимаю что это двоичные данные?
А насколько критично их писать не на одной строке? Добавляй перевод строки и все будет работать. А еще лучше хранить это в dbm файле. Доступ будет проще и быстрее. И используй модуль CGI, он тебе сильно жизнь облегчит. Да и массив тебе ничем не мешает, скорее наоборот ![]()
Проверь, может подойдет ![]() P.S. Увидел ответы после того как написал ![]() -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||
|
|||||
Kiber_rat |
|
||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: нет Всего: 9 |
Вот, еще один вариант, так сказать "компиляция советов"
![]()
-------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||
|
|||||
Guest |
|
|||
Unregistered |
Ураааа! Работает
![]() Не уверен насчет flock(), говорят это срабатывает не во всех случаях, еще не получилось открыть файл с ключом :raw - Unknown open mode! а в остальном вот наваял по вашим советам ![]()
|
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
Вообще-то, было бы не плохо проверять файл не только на существование, но так же и на то, что он является двоичным.
Но это уже тонкости. ![]() -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
Гость_Kris |
|
|||
Unregistered |
Еще выяснилось что паковать надо с флагом Н8, иначе данные сохраняются как строка символов. а не двоичное число
![]() Для оптимизации поиска ввел дополнительную переменную, чтобы не распаковывать в цикле.
|
|||
|
||||
korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 6 Всего: 61 |
a - Строка байт, дополняемая нулями
H - Шестнадцатиричная строка, старший полубайт впереди. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |