我正在尝试理解subs的Perl属性。例如,我期望得到作为输出:
before
middle
after
125
但是我有:
before
middle
after
middle
124
如何使用属性作为主sub的覆盖?
use Attribute::Handlers ;
use Data::Dumper ;
sub decorator( $\*&\@\@$$$ ):ATTR {
my ( $package , $symbol, $referent, $attr , $data, $phase, $filename, $linenum ) = @_ ;
my ( $before , $after ) = @$data ;
# before processing
$before->( @_ ) ;
# decorated sub
my $result = $referent->( ) ;
# after processing
$after->( $result )
}
sub c( $ ):decorator(
# before
sub( $\*&\@\@$$$ ) {
warn 'before' ;
} ,
# after
sub( $ ) {
warn 'after' ;
shift( @_ ) + 1
}
) {
warn 'middle' ;
splice( @_ , 1 ) + 1
}
print( __PACKAGE__->c( 123 ) ) ;
给管理员的。拜托,别抽烟了!
3条答案
按热度按时间d7v8vwbk1#
您忽略的关键信息是
decorator
在编译时被调用一次。decorator
将需要用一个包围真实&c
的子来替换&c
,以获得所需的结果。受试:
注意:这使用了OP自己的答案中的调用约定,这与OP问题中的调用约定不同。
plicqrtu2#
以下是怀疑论者的解决方案。方法的输入和输出过滤器分别:
看一下
sub test:json_input( 0 , 2 ):json_output
。mbjcgjjk3#
这是画布或划痕。这个想法。
我现在接受的版本: