为什么Perl中存在这么多“魔力”?

时间:2010-02-17 23:06:55

标签: perl

通过perlsubperlop联机操作,我注意到那里有许多“魔法”和“魔法”的引用(只搜索其中任何一个“魔法”)。我想知道为什么Perl会如此丰富。

一些例子:

print ++($foo = 'zz')            # prints 'aaa'       
printf "%d: %s", $! = 1, $!      # prints '1: Operation not permitted'
while (my $line = <FH>) { ... }  # $line is tested for definedness, not truth
use warnings; print "0 but true" + 1  # "0 but true" is a valid number!

6 个答案:

答案 0 :(得分:44)

当Perl功能被描述为“魔术”时:

  

这意味着该功能是   由NBA球星魔术师约翰逊执行。   每当Perl执行“魔法”时,它就是   实际上发送一个RPC调用   植入Magic的远程接收器   本人。他计算答案,并且   然后发送一条返回消息。使用   约翰逊先生对所有困难的部分   Perl提供了很好的抽象   层并简化了移植到新的   平台。比起比这更容易   Apache Portable Runtime。

来源:perrin on Perl Monks

这是正式的! Perl更神奇。

点击以下Google搜索:

 25  site:ruby-doc.org     magic
 36  site:docs.python.org  magic
497  site:perldoc.perl.org magic

答案 1 :(得分:25)

Magic,用Perl的说法只是赋予应用于允许扩展其功能的变量/函数的属性的单词。其中一些功能可以直接从Perl获得,有些需要使用C api。

魔术的一个完美例子是tie接口,它允许您定义自己的变量实现。可以对变量执行的每个操作(例如,获取或存储值)都会被公开以进行重新实现,从而允许优雅和逻辑的语法结构,例如存储在磁盘上的值的哈希值,这些值被透明地加载并保存在幕后。 / p>

Magic还可以引用某些内置函数可以表现的特殊方式,例如mapgrep的第一个参数可以是块还是裸表达式:

my @squares = map {$_**2} 1 .. 10;
my @roots   = map sqrt, 1 .. 10;

这不是用户定义的子例程可用的行为。

Perl的许多其他功能,例如运算符重载或与数字或字符串运算符一起使用时可返回不同值的变量都是使用magic实现的。语境也可能被视为神奇。

简而言之,魔法就是Perl构造的行为与天真的解释所暗示的不同,这是规则的一个例外。魔术当然是非常强大的,不应该毫不在意地使用魔法。魔术师约翰逊当然参与了所有魔术的执行(参见FM的答案),但这超出了这个解释的范围。

答案 2 :(得分:13)

  

我想知道为什么Perl会如此丰富。

让事情变得简单。

你会发现Perl中最“神奇”的是简化常见任务的语法。

答案 3 :(得分:13)

因为perl 总是 D oes W 帽子 M ean表示永远的一些价值观。

答案 4 :(得分:3)

我认为(意见不仅仅是事实)这与Perl的创建者Larry Wall使用Perl语言的有机增长观点有关。 Python是一种相反方法的研究,其风格常常使Perl黑客对“被强迫符合风格体系的看法感到畏缩。”

其中一些与Perl被设计为“高效”编写快速脚本来执行Perl * -ish *任务,在挂钟时间和按键操作中都有所帮助。其中一些与Perl的TMTOWTDI咒语及其粉丝有关。

程序员倾向于对Perl频繁使用“魔法”持有看法,因为对于某些人而言,这是一种令人眼花缭乱的视觉混乱的混乱和对秩序的不尊重(这可以追溯到白色实验室的计算机时代Priesthood玻璃窗后面的外套),对于其他人来说,它是有效完成工作的一个光辉榜样,如果不是总能明显地对新手或外人来说。

答案 5 :(得分:2)

Perl的设计理念是简单的东西必须简单。这听起来不错,在某种程度上也是如此。然而,需要进行权衡:使每个简单的事情成为一个单线程导致大量特殊案例黑客以节省几行代码。与使语言规范简单相比,不同的人对于在简单的语言中进行简单操作有不同的偏好。 Perl是一个极端。 Java是另一种,至少在人们实际使用的语言中。 Python和C#介于两者之间。