Perl 社区的强大优势之一是 CPAN,即 Comprehensive Perl Archive Network(综合 Perl 存档网络)。如果您为 Perl 编写了一个可能对其他人有用的模块,社区鼓励您在 CPAN 上发布它。鉴于 Perl 社区也鼓励实验和玩乐,CPAN 命名空间的一部分是为可能被认为是轻浮或琐碎的模块保留的,即 Acme::
层次结构。其中一些模块,虽然显然属于“轻浮或琐碎”的类别,但却是极好的学习练习。万圣节快到了,让我们来看看四个有趣的 Acme 模块,仅仅是为了好玩!
Acme::LookOfDisapproval
Karen Etheridge 的 LookOfDisapproval
模块证明了您可以在 Perl 中使用 Unicode 实现子例程名称。她创建了子例程 ಠ_ಠ
(如果这在您的浏览器中无法正确呈现,请参见下图),它的行为与 Perl 的 warn
函数完全相同。源代码只有 29 行,比描述该模块的文档还要短得多。以下代码片段展示了如何使用它
use Acme::LookOfDisapproval;
ಠ_ಠ 'Tsk, tsk, tsk...';
输出看起来像一个传统的 Perl 警告
Tsk, tsk, tsk... at test1.pl line 2.
您可以在 Acme::LookOfDisapproval 上找到更多关于该模块的文档并查看源代码。
Acme::Dice
实现一组作弊骰子的算法并不是非常困难,但吉姆·培根 (Jim Bacon) 实际上将其发布为开源!巧妙的是,Acme::Dice
可以掷骰子,并根据您的调用方式,返回骰子集合的总和或集合中的单个骰子。您可以指定要掷多少个骰子,每个骰子有多少面(因此使其可用于角色扮演游戏),以及是否应偏向某个值,以及偏向的程度。模块中有一个例程可以掷骰子,即两个六面骰子,可以选择性地偏向掷出 7 点。
这是一小段代码
use Acme::Dice qw(roll_dice roll_craps);
# roll 3d10, honestly
my $total = roll_dice( dice => 3, sides => 10);
print "3d10: $total\n";
# roll 6d6, and weight 4 more heavily, returning the individual dice
my @dice = roll_dice( dice => 6, sides => 6, favor => 4, bias => 40 );
print '6d6: '.join('-', @dice)."\n";
# shoot craps, with loaded dice
my $craps_roll = roll_craps( bias => 30 );
print "Craps roll: $craps_roll\n";
以及输出
3d10: 16
6d6: 4-4-3-4-5-4
Craps roll: 7
小心使用这个模块;吉姆很狡猾,即使您指定了一组诚实的骰子……好吧,阅读源代码。这不是错误。您可以在 Acme::Dice 上查看此模块的源代码。
Acme::Crap
Perl 的 carp
工作方式类似于 warn
,但也会返回调用堆栈跟踪,这对于调试涉及模块调用的问题非常有用。使用 carp
,您可以看到调用线程,更好地了解哪里出了问题。Damian Conway 的 Acme::Crap
让您可以在错误消息中更加强调。这是一些代码
use Acme::Crap;
crap "we have a problem";
crap! "this is a bigger problem";
crap!! "this problem is pretty serious";
crap!!! "really, really bad things have happened";
...以及输出
we have a problem at test1.pl line 3.
This is a bigger problem! at test1.pl line 4.
This Problem Is Pretty Serious!! at test1.pl line 5.
REALLY, REALLY BAD THINGS HAVE HAPPENED!!! at test1.pl line 6.
如您所见,更多的感叹号会提高消息的强调级别。如果您愿意,可以使用此方法来区分警告的严重程度。只有天知道您为什么要这样做,但这是一种方法。有关此模块的源代码和稍微多的文档,请访问 Acme::Crap。
Acme::Damn
在 Perl 中,对象只不过是被祝福过的数据结构,或者显式地与类关联。bless
函数通常用于对象构造函数中,但也同样可以用来任意地将任何格式正确的数据结构关联为类的对象。虽然 bless
是 Perl 内置的,但没有指令可以反向操作——将数据结构与类分离,保持原始结构不变。输入 Ian Brayshaw 的 Acme::Damn
,为开发人员提供这种能力,尽管它可能很少使用。这是一个抽象的代码片段,让您了解一下
use Acme::Damn;
# bunch of code here, that defines $ref
# $ref could be an arrayref, or a reference to a scalar, but most likely is a hashref
my $obj = bless $ref , 'My::Class';
# $obj is now an object instance of My::Class, and you can call methods on it.
$obj->set_foo(123);
my $new_ref = damn $obj; # unbless it!
# neither $new_ref nor $obj are My::Class objects at this point, and
# attempts to use methods from that class on either will result in an error
它有点深奥,但我实际上在单元测试代码中见过 Acme::Damn
的使用。对于这种特定的狭窄情况,它可能很有用,尽管它可能看起来很奇怪。有关此模块的代码和文档,请访问 Acme::Damn。
CPAN 上有成千上万个 Acme 模块。Acme::
命名空间通常用作发布过程的试验场,以便新的贡献者在做更严肃的事情之前学习如何创建和发布新模块。如果您仔细搜索一下,您可能会找到一些有用的东西,或者至少可以开怀一笑!
评论已关闭。