При запуске perl -e "Bla-> new"
, вы получите эту хорошо известную ошибку:
Can't locate object method "new" via package "Bla"
(perhaps you forgot to load "Bla"?)
Произошла на днях в серверном процессе Perl по моей недосмотру. Существует несколько сценариев, и в большинстве из них есть соответствующие операторы use
.Но был один скрипт, который выполнял Bla-> new
в sub blub
в строке 123, но пропускал , используя Bla
вверху, и когда он был запущен одним щелчком мыши без каких-либо других сценариев, использующих Bla
, предварительно загруженных серверным процессом, а затем бац!
Изолированное тестирование сценария было бы очевидным способом защиты от этой конкретной ошибки, но, увы, код зависит от огромной среды. Знаете ли вы другой способ защиты от этого недосмотра?
Обновление
Вот один пример того, как PPI
(несмотря на свои достоинства) ограничен в своем представлении на Perl:
use strict;
use HTTP::Request::Common;
my $req = GET 'http://www.example.com';
$req->headers->push_header( Bla => time );
my $au=Auweia->new;
__END__
PPI::Token::Symbol '$req'
PPI::Token::Operator '->'
PPI::Token::Word 'headers'
PPI::Token::Operator '->'
PPI::Token::Word 'push_header'
PPI::Token::Symbol '$au'
PPI::Token::Operator '='
PPI::Token::Word 'Auweia'
PPI::Token::Operator '->'
PPI::Token::Word 'new'
Установка заголовка и присваивая синтаксическому анализу Auweia-> new
то же самое. Так что я не уверен, как можно опираться на такой шаткий фундамент. Я думаю, проблема в том, что Auweia
также может быть подпрограммой; perl.exe
не может определить до времени выполнения.
Дальнейшее обновление
Хорошо, из поучительных комментариев @ Schwern ниже я узнал, что PPI
- это просто токенизатор, и вы можете использовать его, если принимаете его ограничения.