perl – 如何使用Devel :: Declare注入多行?
发布时间:2020-12-15 21:13:54 所属栏目:大数据 来源:网络整理
导读:我想使用 Devel::Declare 来注入多行Perl代码.但是,Devel :: Declare :: set_linestr()不能处理多行. 通常我会把多个语句一起加入一行.这些语句必须是单独的行,以保留其行号用于错误报告.这是为了解决this bug in Method::Signatures和this related bug.我打
我想使用
Devel::Declare 来注入多行Perl代码.但是,Devel :: Declare :: set_linestr()不能处理多行.
通常我会把多个语句一起加入一行.这些语句必须是单独的行,以保留其行号用于错误报告.这是为了解决this bug in Method::Signatures和this related bug.我打开了替代解决方案. 例如,Method :: Signatures当前会转换此代码… use Method::Signatures; func hello( $who = "World",$greeting = get_greeting($who) ) { die "$greeting,$who"; } …进入… func &;hello; sub hello { BEGIN { Method::Signatures->inject_scope('') }; my $who = (@_ > 0) ? ($_[0]) : ( get_greeting($who)); my $greeting = (@_ > 1) ? ($_[1]) : ( "Hello"); Method::Signatures->too_many_args_error(2) if @_ > 2; die "$greeting,$who"; } 然后,$谁报告第4行而不是第7行. 我想要这样做(或者也可能涉及#line). func &;hello; sub hello { BEGIN { Method::Signatures->inject_scope('') }; my $who = (@_ > 0) ? ($_[0]) : ( "World"); my $greeting = (@_ > 1) ? ($_[1]) : ( get_greeting($who)); Method::Signatures->too_many_args_error(2) if @_ > 2; die "$greeting,$who"; } 这不仅忠实地重现线数,应该get_greeting croak它会从正确的行被调用. 解决方法
根据您自己的答案,以下作品:
sub __empty() { '' } sub parse_proto { my $self = shift; return q[print __LINE__."n"; Foo::__empty( );print __LINE__."n"; Foo::__empty( );print __LINE__."n";]; } 但是引入不可接受的开销,因为必须为每个参数调用__empty()函数.可以通过调用__empty()有条件地使用永远不会评估为true的条件来消除开销. sub __empty() { '' } sub parse_proto { my $self = shift; return q[print __LINE__."n"; 0 and Foo::__empty( );print __LINE__."n"; 0 and Foo::__empty( );print __LINE__."n";]; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |