Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > eval


Автор: od0201 23.10.2010, 22:53
Код

...
use CGI::Carp qw(fatalsToBrowser); 
use warnings; 

...
        my ($session_data, $user_data);
        eval ($session_data = retrieve('./user/data/'.$cookies{'session'})); #<=== этот файл есть 
        eval ($user_data = retrieve('./user/data/'.$$id{'id'}));             #<=== на эту строку ругается
...


Software error:
can't open .user/data/1000000001: No such file or directory at user/session.pl line 169 


да, не существует такого файла, но зачем ругаться ???

В чем прикол?

Заранее благодарен

Автор: tishaishii 23.10.2010, 23:05
А хз кто такой "retrieve". Там и собака порылась, наверное.

Автор: Jimy 24.10.2010, 08:37
"Прикол" здесь в том, что если использовать 
eval {...} вместо eval (...), то ругаться перестанет, а сообщение об ошибке будет помещено в переменную $@;
Объяснить данное поведение, к сожалению, толком не могу. Разница здесь в том, что во втором случае код в eval не рассматривается до этапа выполнение и потом компилируется на лету. Как это влияет на вывод ошибок затрудняюсь объяснить.

И второй момент. Перед тем как работать с файлом внутри функции retrieve, Вы можете выполнить проверки на его существование и доступность и не производить лишние операции если файла нет.
Код

if (-e './user/data/'.$$id{'id'}) { # если файл существует

}

Автор: KSURi 24.10.2010, 13:00
Если вы используете eval(), то аргумент надо брать или в кавычки, или в фигурные скобки. Иначе в eval передастся результат выражения внутри круглых скобок (который на самом деле умирает).

Автор: od0201 26.10.2010, 03:41
хочу заметить что в переменную $@
при {} передается can't open 111.txt: No such file or directory at script.pl line 666
при "" передается syntax error at (eval 10) line 1, near "="

получил исчерпывающий ответ, спасибо Jimy и KSURi  smile 

Автор: Carvolan 31.10.2010, 15:17
Цитата

А хз кто такой "retrieve". 


Скорее всего используется Storable для чтения хешей

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)