Когда вы запускаете 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, но пропускал use 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
- это просто токенизатор, и вы можете использовать его, если вы принимаете его ограничения.