Один из способов справиться с этим - добавить совершенно бесполезное ключевое слово:
sub perform(&) { $_[0] }
with GTK2::VBox->new, perform { ... }
где perform
на самом деле просто более сахарная альтернатива sub
.
Другой способ - написать фильтр Devel :: Declare или Syntax :: Keyword :: plugin для реализации with
, если у вас есть какой-то способ Скажите, когда вы закончите анализ аргумента with
и будете готовы начать синтаксический анализ блочных скобок (сработала бы открывающая фигурная скобка, но тогда хэши стали бы проблемой). Тогда вы могли бы поддержать что-то вроде
with (GTK2::VBox->new) { ... }
и пусть фильтр переписывает что-то вроде
do {
local $_ = GTK2::VBox->new;
do {
...;
};
$_;
}
, который, если он работает, имеет то преимущество, что фактически не создает подпрограмму и, следовательно, не мешает @_
, return
и некоторым другим вещам. Мне кажется, что два слоя do
необходимы для того, чтобы установить крюк EndOfScope в нужном месте.
Очевидными недостатками этого является то, что это сложно, это сложно, и это фильтр исходного кода (даже если он ручной), что означает, что есть проблемы, которые вы должны решить, если вы хотите, чтобы любой код, использующий его, был отлаживаемым вообще .