2012-07-04 16 views
6

Jestem świadomy faktu, że [email protected] jest zmienną globalną, nadal nie mogę zrozumieć, dlaczego muszę zlokalizować go przed użyciem eval:

Na przykład:

eval { SOME_FUNC_THAT_MAY_DIE(); }; 
if ([email protected]) { 
    print "An error occured!\n"; 
} 

Jedynym możliwym Rzeczą, o której mogę myśleć jest to, że jeśli jakiś program obsługi sygnału zadzwoni pod numer die, spróbuję przeczytać [email protected], czego tu brakuje?

Odpowiedz

12

Powodem powiedzieć local [email protected] przed wywołaniem eval jest, aby uniknąć nadepnięcia na swoją rozmówcy [email protected]. To nieuprzejme dla podprogramu, aby zmienić jakiekolwiek zmienne globalne (chyba że jest to jeden z podanych celów podprogramu). To nie jest problem z kodem najwyższego poziomu (nie wewnątrz żadnego podprogramu).

także na starszych Perl, każdy eval zwany podczas niszczenia obiektu będzie sprać globalny [email protected] (jeśli obiekt był niszczony, bo wyjątek został wyrzucony z bloku eval), chyba [email protected] zlokalizowano pierwszy. Było to fixed in 5.14.0, ale wiele osób nadal używa starszych Perls.

9

Try::Tiny dokumentacja moduł daje uzasadnienie (jak również zapewnienie alternatywnego):

Po uruchomieniu bloku eval i to się powiedzie, $ @ zostanie wyczyszczone, potencjalnie clobbering błąd, który jest obecnie złapany. Powoduje to czynność na odległość, usuwanie wcześniejszych błędów, które rozmówca mógł jeszcze nie załatwić. $ @ musi być poprawnie zlokalizowany przed wywołaniem eval, aby uniknąć tego problemu. Mówiąc dokładniej, $ @ jest na początku ewaluacji zablokowane, co również uniemożliwia uchwycenie poprzedniego błędu przed śmiercią (na przykład podczas tworzenia obiektów wyjątków ze stosami błędów).
+0

Powód, dla którego znalazłem ten wpis, wynika właśnie z tego, że nie zrozumiałem dokładnie tego akapitu w dokumentacji Try :: Tiny. Co oznacza "potencjalnie przeszkadzanie", który obecnie jest przechwytywany? ;-) –