use utf8与Method::Signatures::Simple冲突原因及共存方案咨询
Perl中use utf8与Method::Signatures::Simple的冲突问题
以下是一段Perl代码:
use 5.034; use warnings; #use utf8; binmode(STDOUT, ':encoding(utf-8)'); package User { use Method::Signatures::Simple; use Moose; has 'name' => (is => 'rw', isa => 'Str', default => sub { return 'foo' }); method xname { return "čč" . $self->name . "ňň"; } } my $u = User->new; say $u->xname;
这段代码能正常运行,但由于源码包含UTF-8字符,输出结果并不完全正确。取消注释use utf8;后,执行perl -c会抛出如下错误:
Couldn't find declarator 'method' at /u/ae/envs/plenv/versions/5.38.2/lib/perl5/site_perl/5.38.2/amd64-freebsd/Devel/Declare/Context/Simple.pm line 47. Devel::Declare::Context::Simple::skip_declarator(Method::Signatures::Simple=HASH(0x8292a3fa8)) called at /u/ae/envs/plenv/versions/5.38.2/lib/perl5/site_perl/5.38.2/amd64-freebsd/Devel/Declare/MethodInstaller/Simple.pm line 62 Devel::Declare::MethodInstaller::Simple::parser(Method::Signatures::Simple=HASH(0x8292a3fa8), "method", 1, 1) called at /u/ae/envs/plenv/versions/5.38.2/lib/perl5/site_perl/5.38.2/amd64-freebsd/Devel/Declare/MethodInstaller/Simple.pm line 25 Devel::Declare::MethodInstaller::Simple::__ANON__("method", 1) called at /u/ae/envs/plenv/versions/5.38.2/lib/perl5/site_perl/5.38.2/amd64-freebsd/Devel/Declare.pm line 277 Devel::Declare::linestr_callback("const", "method", 1) called at t line 10
问题
- 为何
use utf8编译指示会与Method::Signatures::Simple模块产生冲突? - 如何让
Method::Signatures::Simple与use utf8配合使用?
编辑补充
有人推荐了Function::Parameters模块,该模块能很好支持use utf8,但存在一个限制:无法在Moose的builder子程序中使用method关键字。
例如,以下代码无法运行:
has 'foo' => (is => 'rw', isa => 'Str', default => sub { return 'foo' }); has 'foobar' => (is => 'rw', isa => 'Str', builder => '_buildfoobar'); method _buildfoobar {return $self->foo . 'bar' } # 注意这里用了method
必须改用标准的sub并手动通过shift获取$self:
has 'foo' => (is => 'rw', isa => 'Str', default => sub { return 'foo' }); has 'foobar' => (is => 'rw', isa => 'Str', builder => '_buildfoobar'); sub _buildfoobar {my $self=shift; return $self->foo . 'bar' }
如果没有更好的方案,这个办法可以作为替代。
内容的提问来源于stack exchange,提问作者clt60
相关产品推荐
相关产品推荐

