Как сделать так, чтобы мой код никогда не выходил напрямую? - PullRequest
4 голосов
/ 01 августа 2011
eval{
   require $file;
}

/*subsequent code goes here*/
...

Если $file содержит оператор exit, последующий код не имеет шансов на запуск.

Как обойти так, чтобы последующий код всегда имел шанс на выполнениекогда eval сделано ??

Ответы [ 3 ]

4 голосов
/ 01 августа 2011

Невозможно прервать вызов exit.$file должен использовать die вместо этого, который может быть перехвачен eval.

. В качестве временного решения вы можете переопределить встроенную функцию exit глобально:

BEGIN {
    *CORE::GLOBAL::exit = sub { die "About to exit" } 
}
1 голос
/ 02 августа 2011

Посмотрите на модуль Safe.pm.Это позволяет вам ограничить, какие операторы могут быть выполнены.Он предназначен для ситуаций, когда вам нужно выполнить ненадежный код.

1 голос
/ 01 августа 2011

Вы этого не сделали, но вы можете переопределить функцию perl exit с помощью своей собственной функции, которая выполняет die () сообщения, о котором знает ваш основной код.Затем вы бы использовали CORE :: exit (), если я помню, чтобы получить истинный выход.

Лучше было бы запустить новый код в пакете, отличном от main ::, чтобы вы не повредили main:: s exit.

2011-Aug-06 обновление: для хихиканья Я попробовал:

my $code = qq[print qq(hello exit 99\n); exit 99;];  

{
  package Foo; 
  local $@;
  use vars qw(*exit);   #required
  local *exit = sub { die "TRAPPED EXIT: @_\n"; };  #override local to package Foo;
  print "doing eval\n"; 
  eval $code; 
  print "reason=$@\n";
}

print "done\n";       #prove we did not truly exit
exit 2;               #set specific exit code

И да, Safe.pm хорош для ненадежного кода, но если коддоверяю, это проще.

perl exit.pl; echo $?
doing eval
hello exit 99
reason=TRAPPED EXIT: 99
done
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...