Ответ 1
- Devel:: Declare не позволит вам вернуть то, что уже было проанализировано. Если вы превратите
doing
в ключевое слово, тогда@arr doing ...
все еще необходимо преобразовать в нечто, начинающееся с@arr
, которое кажется довольно большим препятствием. - Из-за того, как Devel:: Declare acutally делает свою магию, он ограничен определенным образом - он позволяет вам объявлять "ключевые слова", которые выглядят как имена подсайтов, в местах, где Perl будет искать имя под. Это не позволит вам помещать произвольные операторы, где вам нравится. На самом деле он работает с наименьшим искажением в ситуациях, когда у вас есть
keyword
somestuff{ ... }
, который может превратиться в простой вызовkeyword(
некоторого другого материала и, возможно, преобразованногоsub { ... })
. Вы можете понять, почему это так хорошо подходит для таких вещей, какmethod
илиTest::Class::Sugar
. Моя точка зрения заключается в том, что сразу же после того, как имя массива не является местом, где Perl-парсер ищет имя суб; это место, где парсер ищет оператора, и поэтому@arr doing ...
даст вам ошибкуbareword found where operator expected
, прежде чем Devel:: Declare получит шанс вмешаться.
Возможно, обоим из них можно было бы преодолеть, изменив ситуацию так, чтобы ваше ключевое слово появилось первым в строке, но теперь у вас есть keyword
somestuff { ... }
, где имя массива является некотором, и вы твердо входите в шаблон, который большинство других модулей вырезали - только если вы создаете цикл for, вы, вероятно, оставите блок как подлинный блок вместо того, чтобы его анализировать как подвое определение.