![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Всем доброго времени суток!
Товарищи, помогите пожалуйста понять для чего нужен eval? Если можно приведите короткий пример с ним и поясните какую роль играет eval в нём. У меня такое чувство что я здесь один задаю вопросы. Заранее благодарен, Денис -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| acp |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 389 Регистрация: 4.2.2003 Где: Владимир Репутация: нет Всего: 2 |
Угу. Т.к. можно увидеть, что наиболее развитые подфорумы на этом форуме - по Дельфи и С.
Ну вообщем, реально eval IMHO нужен только для работы с ошибками, т.е. выполняет роль блока
в Delphi. Функция выполняет кусок кода, т.е. просто как-бы представляет собой отдельную процедуру.
|
||||||||
|
|||||||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: нет Всего: 42 |
Сколь я понял, при помощи eval можно перхватывать ошибки в кусках кода.
НАпример в Perl Coocbook присутствует такой пример
|
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Если я правельно понял, то eval даёт эфект наподобие функции warn, но для перехвата ошибки в блоке.
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Guest_test |
|
|||
|
Unregistered |
Eval часто бывает весьма полезен. Напр. прочитываем файл, содержащий строки типа
var = value var2 = value2 while(<FILE>) { chomp; if (s/ *= */=/) { my ($var,$value) = split(' *= *'); # Заполняем переменные значениями eval ("\$$var = \'$value\'"); } } Без eval - было бы заморочно |
|||
|
||||
| aleksnn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.4.2005 Репутация: 2 Всего: 2 |
Поднял тему и прошу korob2001 ответь на свой вопрос.
Добавлено @ 04:15 Поднял тему и прошу korob2001 ответь на свой вопрос. |
|||
|
||||
| korob2001 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Поясню на примере. Допустим мы принимаем от пользователя числа и делим их, если пользователь попытается разделить первое число на 0, то программа просто завершится крахом. Например если выполнить такой код:
То он закончится такой ошибкой: Illegal division by zero at Untitled line 3., т.е. программа завершилась аварийно. Тепь давай перехватим ошибки при делении и выведем более понятное сообщение и продолжим выполнение программы, перепишем наш код так:
Мы не получим ошибки этапа исполнения, но мы так и не обработали её, просто перехватили. Давай теперь попробуем вывести какое-нить сообщение и подолжим выполнение программы. Если eval перехватил ошибку этапа исполнения, то он сохраняет её в специальную переменную: $@. Вот и проверим её.
В итоге мы получим наше сообщение об ошибке, которое будет присвоено переменной $res, в том случае если возникнет исключительная ситуация этапа исполнения. Если изменить значение переменной $num2 на допустимое число, то мы не получим нашего сообщения, а просто получим результат деления. Всё это хорошо, но у eval есть ещё одна форма eval 'выражение', которая компилирует какой-либо участок кода на лету, на этапе исполнения и перехватует все исключительные ситуации, так же как и первая, но выполняется гораздо медленнее первой, так как она анализирует каждый раз синтаксис. Если кто-то знаком с такими языками как Java, C++, то наверняка знакомы с блоком try {}, eval в Perl выполняет те же функции. Вот аналогичный код проверки деления на 0, только выполняется гораздо медленне:
На самом деле eval { }, это своего рода блок кода из которого можно выходить в любой момент, с помощью return, так же у этого блока своя область видимости как и у обычного блока, т.е. если испоьзовать лексические переменные, то они будут видны в этом блоке. Впринципе это и есть блок. Ну вот, вроде основное описал. Удачи. Это сообщение отредактировал(а) korob2001 - 6.6.2005, 20:10 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||
|
|||||||||
| Гость_frenky |
|
|||
|
Unregistered |
• ее — показывает, что правый аргумент команды s/.../…/ — это строковое выражение, которое надо
вычислить и выполнить как фрагмент кода (через функцию eval). В качестве текста для подстановки используется возвращаемое значение — возможно, после процесса интерполяции |
|||
|
||||
| Гость_frenky |
|
|||
|
Unregistered |
• (?{код}) — условие (мнимый символ), которое всегда выполняется. Сводится к выполнению команд
Perl в фигурных скобках. Вы можете использовать эту конструкцию, только если в начале сценария указана команда use re 'eval'. При последовательном соотнесении текста и шаблона, когда Perl доходит до такой конструкции, выполняется указанный код. Если полного соответствия для оставшихся элементов найти не удалось, то при возврате левее данной точки шаблона вычисления, проделанные с локальными переменными, откатываются назад. (Условие является экспериментальным. В документации, прилагаемой к Perl, можно найти довольно детальное рассмотрение (с примерами) работы этого условия и возможных трудностей в случае его применения.) |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |