2010-11-08 4 views
3

Я пробовал использовать PARSE на ПОРТУ! и он не работает:Использование PARSE на ПОРТУ! значение

>> parse open %test-data.r [to end] 
** Script error: parse does not allow port! for its input argument 

Конечно, это работает, если вы читаете данные:

>> parse read open %test-data.r [to end] 
== true 

... но мне кажется, что было бы полезно, чтобы иметь возможность использовать PARSE на больших файлы без предварительной загрузки в память.

Есть ли причина, по которой PARSE не может работать с ПОРТОМ! ... или это еще не реализовано? не

+0

Может быть, вы должны добавить пожелание в базу данных CureCode: http://curecode.org/rebol3/ – Oldes

ответ

6

простой ответ: нет, мы не можем ...

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

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

Но, как вы знаете, в rebol ... нет, это не ответ. ;-)

Это, как говорится, есть способ, чтобы обрабатывать данные из порта, как его время схватил, но его немного больше работы.

, что вы делаете, это использовать буфер, и

APPEND buffer COPY/part connection amount 

В зависимости от ваших данных, сумма может быть 1 байт или 1KB, использовать то, что имеет смысл.

Как только новый ввод добавляется в буфер, проанализируйте его и добавьте логику, чтобы узнать, соответствует ли вам часть этого буфера.

Если что-то положительно согласовано, вы удаляете/разделяете то, что согласовано с буфером, и продолжайте синтаксический анализ, пока ничего не разберется.

вы затем повторяете выше, пока не достигнете конца ввода.

Я использовал это на сервере tcp реального времени EDI, который имеет «всегда включен» порт tcp, чтобы разбить (потенциально) непрерывный поток входных данных, который фактически копирует сообщения до конца ,

детали

Лучший способ установки этой системы не использовать/не ждать и петли до закрытий порта (вы не получите ни вместо «»).

Кроме того, убедитесь, что у вас есть способ проверить проблемы с целостностью данных (например, пропущенный байт или ошибочное сообщение) при разборе, в противном случае вы будете никогда достичь конца.

В моей системе, когда буфер был за пределами определенного размера, я попробовал альтернативное правило, которое пропускало байты до тех пор, пока шаблон не сможет найти дальше по потоку. Если он был найден, была зарегистрирована ошибка, сохраненное частичное сообщение и предупреждение для sysadmin для сортировки сообщения.

HTH!

+1

Я не знаю много о PORT ! схемы, и большинство моих реболов, занимающихся до сих пор, не должны были беспокоиться об этом. Но HEAD, похоже, работает над ПОРТОМ! в R3, например ... не будет ли откат этого адреса? – HostileFork

3

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

Также как Максим говорит, вы можете это сделать и сейчас, но это очень зависит от того, что именно вы хотите сделать.

Вы можете разбирать большие файлы, не задумываясь, чтобы их полностью прочитать в памяти. Всегда хорошо знать, что вы собираетесь анализировать. Например, все большие файлы, такие как файлы для музыки и видео, делятся на куски, поэтому вы можете просто использовать копию | искать, чтобы получить эти куски и проанализировать их.

Если вы хотите получить только названия нескольких веб-страниц, вы можете просто прочитать, скажем, первые 1024 байта, и искать здесь тег заголовка, если он терпит неудачу, прочитайте больше байтов и повторите попытку ...

Это именно то, что нужно сделать, чтобы разрешить разбор по порту в любом случае.

И не стесняйтесь добавить WISH в базе данных CureCode: http://curecode.org/rebol3/

+1

Я возьму все это, сказав, что некоторые (но не все) порты предлагают средство SEEK, и поэтому технически возможно, что синтаксический анализ может предлагать полную функциональность на этих портах, он просто не реализован ... – HostileFork