用有趣的Perl模块捣蛋
Perl社区的强大优势之一是CPAN,即Perl综合归档网络 。 如果您为Perl编写了一个可能对其他人有用的模块,那么社区鼓励您在CPAN上发布它。 鉴于Perl社区还鼓励实验和游戏,因此CPAN命名空间的一部分保留给了那些看似琐碎或琐碎的模块,即Acme::层次结构。 这些模块中的一些虽然显然适合“轻而易举”类别,但却是出色的学习练习。 随着万圣节的到来,让我们看看四个有趣的Acme模块,..
Perl社区的强大优势之一是CPAN,即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
小心此模块; Jim偷偷摸摸,即使您指定了一套诚实的骰子,也要阅读源代码。 这不是错误。 您可以在Acme :: Dice上查看此模块的源代码。
Acme ::废话
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::
命名空间通常用作发布过程的测试平台,因此新的参与者可以在做更认真的事情之前学习如何创建和发布新模块。 如果您四处挖掘,可能会发现有用的东西,或者至少是一个愉快的笑声!
翻译自: https://opensource.com/life/16/10/trick-or-treat-funny-perl-modules
更多推荐
所有评论(0)