【问题标题】:Use unicode filenames with Module::Starter将 unicode 文件名与 Module::Starter 一起使用
【发布时间】:2013-01-17 01:05:53
【问题描述】:

背景:

我希望创建一个包含一些供个人使用的模块的发行版——它永远不会出现(又名 CPAN)。我想使用Module::Starter 启动这些模块,以利用简单的测试和版本管理。

(Ubuntu GNU/Linux 上的 perl 5.12.4)

问题:

如何在 Module::Starter 中使用 Unicode 文件名,例如Local::Λ← (Lambda)?

这不起作用:

$ module-starter --module Local::Λ
Invalid module name: Local::Λ at /usr/local/share/perl/5.12.4/Module/Starter/App.pm line 132.

实际失败的行是

croak "Invalid module name: $_" unless /\A[a-z_]\w*(?:::[\w]+)*\Z/i;

Module::Starter::Simple(第 95 行)中。

Lambda 显然是一个“单词”字符。

顺便说一句,这行得通:

$ cat > xΛ.pm
use utf8;
package xΛ;
sub foo { print "42\n" }
1;
^D
$ perl -Mutf8 -MxΛ -e 'xΛ::foo()'
42
$ 

我还没有尝试过的事情:

  • 花一天时间编译 perl 5.16 以获得更多 unicode 优点。
  • 从源头上破解,并启用远程连接到 unicode 的任何东西。
  • 检查这不仅仅是对发行版名称的限制(我并不担心,因为 CPAN 永远不会看到这一点)。
  • 检查这是否是Getopt::Long 问题。

【问题讨论】:

    标签: perl unicode perl-module


    【解决方案1】:

    “单词字符”的定义随着以下因素的变化而变化: a) 您的 perl 版本。 b) 如果有问题的脚本使用您的输入作为二进制字符串或字符串。查看最新版本的 perl 正则表达式引擎的 /a/u 标志。

    仅供参考:因为 Perl 人力求跨平台兼容性,并且在各种文件系统中对 Unicode 的支持差异很大,所以他们决定目前不支持 Unicode 模块名称。


    来自 Amon 评论的解决方案: 这成功了:

    perl -Mutf8 -M5.012 -MModule::Starter::App -E'$ARGV[1]="Local::\x{039B}";Module::Starter::App->run' -- --module Local::Λ --license gpl3 --ignore git
    

    (根据perlre,使用\x{...} 转义强制Unicode)。

    【讨论】:

    • 我的模块名称的第一个字母是Local::Λm 中的L,它与/^[a-z_]/i 匹配。正如我的示例所示,Unicode 模块名称 work 是真实的,我不关心跨平台(→ 个人​​使用)。
    • 是的,我理解个人使用的东西。我只是提到它是为了指出您不应该期望在现有代码中对它有太多支持。您可以在这里轻松地探索相对较新的领域。
    • “单词字符”的定义也随着以下因素而变化:a)您的 perl 版本。 b) 如果有问题的脚本使用您的输入作为二进制字符串或字符串。查看最新版本的 perl 正则表达式引擎的 'a' 和 'u' 标志。
    • 带有标志的最后一部分实际上是一个很好的提示(尽管我没有它们,因为我是 5.14 之前的版本)。该文档包含有关如何强制使用 unicode 语义的示例,这成功了:perl -Mutf8 -M5.012 -MModule::Starter::App -E'$ARGV[1]="Local::\x{039B}";Module::Starter::App->run' -- --module Local::Λ --license gpl3 --ignore git(使用 \x{...} 转义强制 unicode)。非常老套,但谢谢。
    • 您可能希望重构您的答案以包含实际有助于解决问题的信息。我会很荣幸接受它。
    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2019-05-19
    • 1970-01-01
    • 2017-02-10
    • 2016-06-13
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多