【问题标题】:Moose && utf8 (package|method) namesMoose && utf8(包|方法)名称
【发布时间】:2012-06-26 13:25:30
【问题描述】:

有这个:

use utf8;
package ÁngryBird;   #note the Á in the package name

perl -c 结果是 syntax OK

use utf8;
package ÁngryMoose;
use Moose;

perl -c 说,

ÁngryMoose is not a module name at 
/opt/local/lib/perl5/site_perl/5.12.4/darwin-multi-2level/Class/MOP/Package.pm
 line 209.

那么,代码有什么问题?

【问题讨论】:

  • 相关:p3rl.org/…
  • @daxim ,你能说得更准确一点吗?您所说的 perl-delta 的哪一部分是相关的?
  • @cajwine,daxim 在那里有一个内部链接,它指出 Unicode 包名称根本无法根据 perl 5.8 delta 工作。我不确定从那以后它是否得到了清理。
  • 好的,刚刚找到。所以,现在的问题是,为什么在第一个例子中(没有 Moose)的语法是好的。为什么会有这样的差异?
  • 我认为文档中最相关的引述是:“虽然在 Perl 5.8.0 中确实存在一些有限的功能,但这比设计的更意外”。

标签: perl utf-8 moose


【解决方案1】:

Moose 使用来自Package::Stash::PPthis regexp 来检查包名:

elsif ($package !~ /\A[0-9A-Z_a-z]+(?:::[0-9A-Z_a-z]+)*\z/) {
    confess "$package is not a module name";
}

this regexp 来自Package::Stash::XS

const char *vmre = "\\A[0-9A-Z_a-z]+(?:::[0-9A-Z_a-z]+)*\\z";

但是你may create your own package stash inplementation在命名空间Package::Stash,并在加载Package::Stash之前通过设置环境变量PACKAGE_STASH_IMPLEMENTATION或变量$Package::Stash::IMPLEMENTATION来使用它。例如,如果您的实现名称为 Package::Stash::My,则将变量设置为 My

【讨论】:

  • 好的,谢谢。 Soo 这是一个有意的 Moose “功能”。 :( 也许在 perl v23.7...
  • 这听起来像是 Package::Stash 中的一个错误。请在 rt.cpan.org 中提交错误。
  • 该错误已在 8 个月前提交为 #72057: over-strict rules for module names。没有反应。也许我们应该强迫它?
【解决方案2】:

听起来可能是Class::MOP 错误。您是否尝试过在那里询问或报告错误?

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多