标签 Perl 下的文章

Larry Wall 发布消息:Perl 6 于 2015 年 12 月 25 日 22:00 GMT 时间发布了!按照承诺,发布了测试套件和编译器。愿上帝保佑我们每个人。

Perl 6  的 LOGO: Camelia

Hello,听,听,听!注意!——大家请注意了!!!

喔,谢谢大家。

嗨,我是 卡梅丽娅 Camelia (LCTT 译注:这是 Perl 6 的 logo 的名字),认识我吧(也许不认识呢)。他们告诉我,我需要在 Perl 6 官方发布会 Perl 6’s official Coming Out Party 上作个讲话,所以我就来了。嗯,他们是棋手,而我只是一枚棋子。他们还跟我强调要严肃点,呃,说的好像我知道怎么认真演讲一样,玩真的吗?

好吧好吧,严肃一些,首先我要感谢所有今天“ 走出来 coming out ”的人。

呃,我好像说错了什么。呃,抱歉,我不是指“ 出柜 coming out ”的那个意思……

但是,感谢您的到来。今天是 Perl 6 的大日子,从现在起,她成年了。或者说快成年了吧。反正,她可以正式上路了。看着吧,全世界!

[从后排传来了一些听不清的议论]

(旁白)额,我之前是不是不应该多嘴的?我并不是说她剐坏了那些翼子板什么的。好吧,无论如何,让继续吧。我相信从现在起她会是一个好司机。

不管怎样,我已经对 Perl 6 着迷不已,因为我就是一只 蝴蝶 butterfly 啊(LCTT 译注,Perl 6 的 logo 就是一只蝴蝶,见题图)。我花了很长一段时间才从蝶蛹里 走出来 coming out 。是真正意义上的走出来,走出来,走出来!重要的事情说三遍!

哎呀,又碰到高压线了,哈哈哈。

不管怎么说,请大家对 Perl 6 耐心点。今天,我们宣布她基本上是个大人了,但是你也知道,她毕竟还年轻啊。我们小时候,岁数有多少,我们就多大。青年时期,经历荷尔蒙的变化,我们开始变得动荡。而且一小会就振动一次。所以我们 15 岁时,波动像是能加减 10 年。所以,有时候我们会表现得像 25 岁那么成熟,有时候又会回到 5 岁般无知。

当然,Perl 6 还要更成熟些,这并不是说在她发脾气把我们逼疯时就不爱她了。我的意思是,她就像家人一样。你和家人有时疏远有时亲近,因为你知道,一家人总会慢慢亲近的。

我们和她是一个大家庭,今天聚集一堂。有人说抚养一个孩子需要有一个村庄,但是从来没有这样的孩子,也没有这样的村庄。明天宿醉醒后,有机会的话看看节目单,你会在后面看到一个感恩列表,有超过 800 个人的名字!他们通过相同或者不同方式,积极地为 Perl 6 的发展做出了贡献。当然,有些名字无法一一列出。

我说的不是你,我说的是在座的各位,你们全是伟大的人!不仅仅是家庭里最亲近的成员。这个家庭很久以前就意识到,对于一个不断发展的编程语言来说,一些最有价值的建议都是来自直系成员之外。来自朋友和熟人的要比家里的更多。所以说需要一个村庄。

成熟是一个分形的概念,它可以在不同的尺度上说。你们全是 Perl 6 走向互联网的代表。眼前是一个粗暴的世界,多亏有你们, Perl 6 已经为它做好了一些准备。

当然,她才仅仅 15 岁,有些事她做的很好,她的沟通技巧很棒,如果她不认识你的时候也很守礼。她能够同时做几个对话,她在数学方面很棒,在操作各种对象时也技巧谙熟,她喜欢外语以及那些有趣的字母。

但是她仍然是个孩子,有时候学习一些东西时觉得有点困难。没关系,接下来几年她会越来越快,越来越有效率,她的大脑也会自我进化得像个成年人一样。她会学习很多东西,包括这个世界和她自己。但是我觉得她的个性是改不了的,至少现在看来如此。

这是因为她的个性都是来自你们。你们全都爱着她,现在,她已经准备好把这些爱传递给她未曾谋面的人。

当火箭发射时我们全都会很兴奋!TimToady(LCTT 译注:即 Larry Wall)告诉我凌晨起床去看水星、双子座和阿波罗火箭起飞。我年纪太小,记不清那些。不过我们也有我们自己激动人心的事情要关注。我是非常高兴看到 SpaceX 火箭本周回收成功,虽然有点磕磕碰碰……

SpaceX 火箭发射回收成功

[又一些听不清的议论]

(旁白)抱歉,我没注意到你。我们确实会忽视某些人,不要成为之一。

好吧,幸灾乐祸的人我也很讨厌。

不管怎么说,Perl 6 的发布挺像火箭发射。倒计时的时候会很紧张,当你在想它是发射成功还是爆炸时会情不自禁的屏住呼吸。这就像我们现在的情况,主引擎已经点火,夹具已经放开。看起来非常戏剧性,主要是因为目前看来不会出大娄子。

但是这并不是火箭发射,戏剧性也不是火箭发射所想要的。火箭要的是发射!越来越快,越来越快!无关高度,甚至无关速度,要的是加速度。

[让我们举杯]

所以,Perl 6 破茧了,她可以自由飞翔了。因其成长而快乐,因其发现而欢愉,不断加速吧!干杯!

感谢 @soooogreen 的校对补完。

经历了15年的打造,Perl 6 终将在年底与大家见面。我们预先采访了它的作者了解一下新特性。

Larry Wall 是个相当有趣的人。他是编程语言 Perl 的创造者,这种语言被广泛的誉为将互联网粘在一起的胶水,也由于大量地在各种地方使用非字母的符号被嘲笑为‘只写’语言——以难以阅读著称。Larry 本人具有语言学背景,以其介绍 Perl 未来发展的演讲“ 洋葱的状态 State of the Onion ”而闻名。(LCTT 译注:“洋葱的状态”是 Larry Wall 的年度演讲的主题,洋葱也是 Perl 基金会的标志。)

在2015年布鲁塞尔的 FOSDEM 上,我们赶上了 Larry,问了问他为什么 Perl 6 花了如此长的时间(Perl 5 的发布时间是1994年),了解当项目中的每个人都各执己见时是多么的难以管理,以及他的语言学背景自始至终究竟给 Perl 带来了怎样的影响。做好准备,让我们来领略其中的奥妙……

Linux Voice:你曾经有过计划去寻找世界上某个地方的某种不见经传的语言,然后为它创造书写的文字,但你从未有机会去实现它。如果你能回到过去,你会去做么?

Larry Wall:你首先得是个年轻人才能搞得定!做这些事需要投入很大的努力和人力,以至于已经不适合那些上了年纪的人了。健康、活力是其中的一部分,同样也因为人们在年轻的时候更容易学习一门新的语言,只有在你学会了语言之后你才能写呀。

我自学了日语十年,由于我的音系学和语音学的训练我能说的比较流利——但要理解别人的意思对我来说还十分困难。所以到了日本我会问路,但我听不懂他们的回答!

通常需要一门语言学习得足够好才能开发一个文字体系,并可以使用这种语言进行少量的交流。在你能够实际推广它和用本土人自己的文化教育他们前,那还需要一些年。最后才可以教授本土人如何以他们的文明书写。

当然如果在语言方面你有帮手 —— 经过别人的提醒我们不再使用“语言线人”来称呼他们了,那样显得我们像是在 CIA 工作的一样!—— 你可以通过他们的帮助来学习外语。他们不是老师,但他们会以另一种方式来启发你学习 —— 当然他们也能教你如何说。他们会拿着一根棍子,指着它说“这是一根棍子”,然后丢掉同时说“棒子掉下去了”。然后,你就可以记下一些东西并将其系统化。

大多数让人们有这样做的动力是翻译圣经。但是这只是其中的一方面;另一方面也是为了文化保护。传教士在这方面臭名昭著,因为人类学家认为人们应该基于自己的文明来做这件事。但有些人注定会改变他们的文化——他们可能是军队、或是商业侵入,如可口可乐或者缝纫机,或传教士。在这三者之间,传教士相对来讲伤害最小的了,如果他们恪守本职的话。

LV:许多文字系统有本可依,相较而言你的发明就像是格林兰语…

印第安人照搬字母就发明了他们自己的语言,而且没有在这些字母上施加太多我们给这些字母赋予的涵义,这种做法相当随性。它们只要能够表达出人们的所思所想,使交流顺畅就行。经常是有些 声调语言 Tonal language 使用的是西方文字拼写,并尽可能的使用拉丁文的字符变化,然后用重音符或数字标注出音调。

在你开始学习如何使用语音和语调表示之后,你也开始变得迷糊——或者你的书写就不如从前准确。或者你对话的时候像在讲英文,但发音开始无法匹配拼写。

LV:当你在开发 Perl 的时候,你的语言学背景会不会使你认为:“这对程序设计语言真的非常重要”?

LW:我在人们是如何使用语言上想了很多。在现实的语言中,你有一套名词、动词和形容词的体系,并且你知道这些单词的词性。在现实的自然语言中,你时常将一个单词放到不同的位置。我所学的语言学理论也被称为 法位学 phoenetic ,它解释了这些在自然语言中工作的原理 —— 也就是有些你当做名词的东西,有时候你可以将它用作动词,并且人们总是这样做。

你能很好的将任何单词放在任何位置而进行沟通。我比较喜欢的例子是将一个整句用作为一个形容词。这句话会是这样的:“我不喜欢你的[我可以用任何东西来取代这个形容词的]态度”!

所以自然语言非常灵活,因为聆听者非常聪明 —— 至少,相对于电脑而言 —— 你相信他们会理解你最想表达的意思,即使存在歧义。当然对电脑而言,你必须保证歧义不大。

“在 Perl 6 中,我们试图让电脑更准确的了解我们。”

可以说在 Perl 1到5上,我们针对歧义方面处理做得还不够。有时电脑会在不应该的时候迷惑。在 Perl 6上,我们找了许多方法,使得电脑对你所说的话能更准确的理解,就算用户并不清楚这底是字符串还是数字,电脑也能准确的知道它的类型。我们找到了内部以强类型存储,而仍然可以无视类型的“以此即彼”的方法。

LV:Perl 被视作互联网上的“ 胶水 glue ”语言已久,能将点点滴滴组合在一起。在你看来 Perl 6 的发布是否符合当前用户的需要,或者旨在招揽更多新用户,能使它重获新生吗?

LW:最初的设想是为 Perl 程序员带来更好的 Perl。但在看到了 Perl 5 上的不足后,很明显改掉这些不足会使 Perl 6更易用,就像我在讨论中提到过 —— 类似于 托尔金(J. R. R. Tolkien) 在《指环王》前言中谈到的适用性一样

重点是“简单的东西应该简单,而困难的东西应该可以实现”。让我们回顾一下,在 Perl 2和3之间的那段时间。在 Perl 2上我们不能处理二进制数据或嵌入的 null 值 —— 只支持 C 语言风格的字符串。我曾说过“Perl 只是文本处理语言 —— 在文本处理语言里你并不需要这些功能”。

但当时发生了一大堆的问题,因为大多数的文本中会包含少量的二进制数据 —— 如 网络地址 network addresses 及类似的东西。你使用二进制数据打开套接字,然后处理文本。所以通过支持二进制数据,语言的 适用性 applicability 翻了一倍。

这让我们开始探讨在语言中什么应该简单。现在的 Perl 中有一条原则,是我们偷师了 哈夫曼编码 Huffman coding 的做法,它在位编码系统中为字符采取了不同的尺寸,常用的字符占用的位数较少,不常用的字符占用的位数更多。

我们偷师了这种想法并将它作为 Perl 的一般原则,针对常用的或者说常输入的 —— 这些常用的东西必须简单或简洁。不过,另一方面,也显得更加的 不规则 irregular 。在自然语言中也是这样的,最常用的动词实际上往往是最不规则的。

所以在这样的情况下需要更多的差异存在。我很喜欢的一本书是 Umberto Eco 写的《 探寻完美的语言 The Search for the Perfect Language 》,说的并不是计算机语言;而是哲学语言,大体的意思是古代的语言也许是完美的,我们应该将它们带回来。

所有的这类语言错误的认为类似的事物其编码也应该总是类似的。但这并不是我们沟通的方式。如果你的农场中有许多动物,他们都有相近的名字,当你想杀一只鸡的时候说“走,去把 Blerfoo 宰了”,你的真实想法是宰了 Blerfee,但有可能最后死的是一头牛(LCTT 译注:这是杀鸡用牛刀的意思吗?哈哈)。

所以在这种时候我们其实更需要好好的将单词区分开,使沟通信道的冗余增加。常用的单词应该有更多的差异。为了达到更有效的通讯,还有一种自足(LCTT 译注:self-clocking ,自同步,概念来自电信和电子行业,此处译为“自足”更能体现涵义)编码。如果你在一个货物上看到过 UPC 标签(条形码),它就是一个自足编码,每对“条”和“空”总是以七个列宽为单位,据此你就知道“条”的宽度加起来总是这么宽。这就是自足。

在电子产品中还有另一种自足编码。在老式的串行传输协议中有停止和启动位,来保持同步。自然语言中也会包含这些。比如说,在写日语时,不用使用空格。由于书写方式的原因,他们会在每个词组的开头使用中文中的汉字字符,然后用 音节表 syllabary 中的字符来结尾。

LV:是平假名,对吗?

LW: 是的,平假名。所以在这一系统,每个词组的开头就自然就很重要了。同样的,在古希腊,大多数的动词都是搭配好的(declined 或 conjugated),所以它们的标准结尾是一种自足机制。在他们的书写体系中空格也是可有可无的 —— 引入空格是更近代的发明。

所以在计算机语言上也要如此,有的值也可以自足编码。在 Perl 上我们重度依赖这种方法,而且在 Perl 6 上相较于前几代这种依赖更重。当你使用表达式时,你要么得到的是一个词,要么得到的是 插值 infix 操作符。当你想要得到一个词,你有可能得到的是一个前缀操作符,它也在相同的位置;同样当你想要得到一个插值操作符,你也可能得到的是前一个词的后缀。

但是反过来。如果编译器准确的知道它想要什么,你可以稍微 重载 overload 它们,其它的让 Perl 来完成。所以在斜线“/”后面是单词时它会当成正则表达式,而斜线“/”在字串中时视作除法。而我们并不会重载所有东西,因为那只会使你失去自足冗余。

多数情况下我们提示的比较好的语法错误消息,是出于发现了一行中出现了两个关键词,然后我们尝试找出为什么一行会出现两个关键字 —— “哦,你一定漏掉了上一行的分号”,所以我们相较于很多其他的按步照班的解析器可以生成更好的错误消息。

LV:为什么 Perl 6 花了15年?当每个人对事物有不同看法时一定十分难于管理,而且正确和错误并不是绝对的。

LW:这必须要非常小心地平衡。刚开始会有许多的好的想法 —— 好吧,我并不是说那些全是好的想法。也有很多令人烦恼的地方,就像有361条 RFC [功能建议文件],而我也许只想要20条。我们需要坐下来,将它们全部看完,并忽略其中的解决方案,因为它们通常流于表象、视野狭隘。几乎每一条只针对一样事物,如若我们将它们全部拼凑起来,那简直是一堆垃圾。

“掌握平衡时需要格外小心。毕竟在刚开始的时候总会有许多的好主意。”

所以我们必须基于人们在使用 Perl 5 时的真实感受重新整理,寻找统一、深层的解决方案。这些 RFC 文档许多都提到了一个事实,就是类型系统的不足。通过引入更条理分明的类型系统,我们可以解决很多问题并且即聪明又紧凑。

同时我们开始关注其他方面:如何统一特征集并开始重用不同领域的想法,这并不需要它们在下层相同。我们有一种标准的书写 配对 pair 的方式——好吧,在 Perl 里面有两种!但使用冒号书写配对的方法同样可以用于基数计数法或是任何进制的文本编号。同样也可以用于其他形式的 引用 quoting 。在 Perl 里我们称它为“奇妙的一致”。

“做了 Perl 6 的早期实现的朋友们,握着我的手说:“我们真的很需要一位语言的设计者。””

同样的想法涌现出来,你说“我已经熟悉了语法如何运作,但是我看见它也被用在别处”,所以说视角相同才能找出这种一致。那些提出各种想法和做了 Perl 6 的早期实现的人们回来看我,握着我的手说:“我们真的需要一位语言的设计者。您能作为我们的 仁慈独裁者 benevolent dictator 吗?”(LCTT 译注:Benevolent Dictator For Life,或 BDFL,指开源领袖,通常指对社区争议拥有最终裁决权的领袖,典故来自 Python 创始人 Guido van Rossum, 具体参考维基条目解释)。

所以我是语言的设计者,但总是听到:“不要管具体 实现 implementation !我们目睹了你对 Perl 5 做的那些,我们不想历史重演!”真是让我忍俊不禁,因为他们作为起步的核心和原先 Perl 5 的内部结构上几乎别无二致,也许这就是为什么一些早期的实现做的并不好的原因。

因为我们仍然在摸索我们的整个设计,其实现在做了许多 VM (虚拟机)该做什么和不该做什么的假设,所以最终这个东西就像面向对象的汇编语言一样。类似的问题在伊始阶段无处不在。然后 Pugs 这家伙走过来说:“用用看 Haskell 吧,它能让你们清醒的认识自己正在干什么,让我们用它来弄清楚下层的 语义模型 semantic model 。”

因此,我们明确了其中的一些语义模型,但更重要的是,我们开始建立符合那些语义模型的测试套件。在这之后,Parrot VM 继续进行开发,并且出现了另一个实现 Niecza ,它基于 .Net,是由一个年轻的家伙搞出来的。他很聪明,实现了 Perl 6 的一个很大的子集。不过他还是一个人干,并没有找到什么好方法让别人介入他的项目。

同时 Parrot 项目变得过于庞大,以至于任何人都不能真正的深入掌控它,并且很难重构。同时,开发 Rakudo 的人们觉得我们可能需要在更多平台上运行它,而不只是在 Parrot VM 上。 于是他们发明了所谓的可移植层 NQP ,即 “Not Quite Perl”。他们一开始将它移植到 JVM(Java虚拟机)上运行,与此同时,他们还秘密的开发了一个叫做 MoarVM 的 VM ,它去年才刚刚为人知晓。

无论 MoarVM 还是 JVM 在 回归测试 regression test 中表现得十分接近 —— 在许多方面 Parrot 算是尾随其后。这样不挑剔 VM 真的很棒,我们也能开始考虑将 NQP 发扬光大。 谷歌夏季编码大赛 Google Summer of Code project 的目标就是针对 JavaScript 的 NQP,这应该靠谱,因为 MoarVM 也同样使用 Node.js 作为日常处理。

我们可能要将今年余下的时光投在 MoarVM 上,直到 6.0 发布,方可休息片刻。

LV:去年英国,政府开展 编程年活动 Year of Code ,来激发年轻人对编程的兴趣。针对活动的建议五花八门——类似为了让人们准确的认识到内存的使用你是否应该从低阶语言开始讲授,或是一门高阶语言。你对此作何看法?

LW:到现在为止,Python 社区在低阶方面的教学工作做得比我们要好。我们也很想在这一方面做点什么,这也是我们有蝴蝶 logo 的部分原因,以此来吸引七岁大小的女孩子!

Perl 6 : Camelia

“到现在为止,Python 社区在低阶方面的教学工作做得比我们要好。”

我们认为将 Perl 6 作为第一门语言来学习是可行的。一大堆的将 Perl 5 作为第一门语言学习的人让我们吃惊。你知道,在 Perl 5 中有许多相当大的概念,如闭包,词法范围,和一些你通常在函数式编程中见到的特性。甚至在 Perl 6 中更是如此。

Perl 6 花了这么长时间的部分原因是我们尝试去坚持将近 50 种互不相同的原则,在设计语言的最后对于“哪点是最重要的规则”这个问题还是悬而未决。有太多的问题需要讨论。有时我们做出了决定,并已经工作了一段时间,才发现这个决定并不很正确。

之前我们并未针对并发程序设计或指定很多东西,直到 Jonathan Worthington 的出现,他非常巧妙的权衡了各个方面。他结合了一些其他语言诸如 Go 和 C# 的想法,将并发原语写的非常好。 可组合性 Composability 是一个语言至关重要的一部分。

有很多的程序设计系统的并发和并行写的并不好 —— 比如线程和锁,不良的操作方式有很多。所以在我看来,额外花点时间看一下 Go 或者 C# 这种高阶原语的开发是很值得的 —— 那是一种关键字上的矛盾 —— 写的相当棒。


via: http://www.linuxvoice.com/interview-larry-wall/

作者:Mike Saunders 译者:martin2011qi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

SQLite是一个零配置、无服务端、基于文件的事务型数据库系统。由于它的轻量级,自包含和紧凑的设计,所以当你想要集成数据库到你的程序中时,SQLite是一个非常不错的选择。在这篇文章中,我会展示如何用Perl脚本来创建和访问SQLite数据库。我演示的Perl代码片段是完整的,所以你可以很简单地修改并集成到你的项目中。

访问SQLite的准备

我会使用SQLite DBI Perl驱动来连接到SQLite3。因此你需要在Linux中安装它(和SQLite3一起)。

Debian、 Ubuntu 或者 Linux Mint

$ sudo apt-get install sqlite3 libdbd-sqlite3-perl

CentOS、 Fedora 或者 RHEL

$ sudo yum install sqlite perl-DBD-SQLite

安装后,你可以检查SQLite驱动可以通过下面的脚本访问到。

#!/usr/bin/perl

my @drv = DBI->available_drivers();
print join("\n", @drv), "\n";

如果你运行脚本,你应该会看见下面的输出。

DBM
ExampleP
File
Gofer
Proxy
SQLite
Sponge

Perl SQLite 访问示例

下面就是Perl访问SQLite的示例。这个Perl脚本会演示下面这些SQLite数据库的常规管理。

  • 创建和连接SQLite数据库
  • 在SQLite数据库中创建新表
  • 在表中插入行
  • 在表中搜索和迭代行
  • 在表中更新行
  • 在表中删除行
use DBI;
use strict;

# 定义数据库名称和驱动
my $driver   = "SQLite";
my $db_name = "xmodulo.db";
my $dbd = "DBI:$driver:dbname=$db_name";

# sqlite 没有用户名密码的概念
my $username = "";
my $password = "";

# 创建并连接到数据库
# 以下创建的文件名为 xmodulo.db
my $dbh = DBI->connect($dbd, $username, $password, { RaiseError => 1 })
                      or die $DBI::errstr;
print STDERR "Database opened successfully\n";

# 创建表
my $stmt = qq(CREATE TABLE IF NOT EXISTS NETWORK
             (ID INTEGER PRIMARY KEY     AUTOINCREMENT,
              HOSTNAME       TEXT    NOT NULL,
              IPADDRESS      INT     NOT NULL,
              OS             CHAR(50),
              CPULOAD        REAL););
my $ret = $dbh->do($stmt);
if($ret < 0) {
   print STDERR $DBI::errstr;
} else {
   print STDERR "Table created successfully\n";
}

# 插入三行到表中
$stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
           VALUES ('xmodulo', 16843009, 'Ubuntu 14.10', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
           VALUES ('bert', 16843010, 'CentOS 7', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;

$stmt = qq(INSERT INTO NETWORK (HOSTNAME,IPADDRESS,OS,CPULOAD)
           VALUES ('puppy', 16843011, 'Ubuntu 14.10', 0.0));
$ret = $dbh->do($stmt) or die $DBI::errstr;

# 在表中检索行
$stmt = qq(SELECT id, hostname, os, cpuload from NETWORK;);
my $obj = $dbh->prepare($stmt);
$ret = $obj->execute() or die $DBI::errstr;

if($ret < 0) {
   print STDERR $DBI::errstr;
}
while(my @row = $obj->fetchrow_array()) {
      print "ID: ". $row[0] . "\n";
      print "HOSTNAME: ". $row[1] ."\n";
      print "OS: ". $row[2] ."\n";
      print "CPULOAD: ". $row[3] ."\n\n";
}

# 更新表中的某行
$stmt = qq(UPDATE NETWORK set CPULOAD = 50 where OS='Ubuntu 14.10';);
$ret = $dbh->do($stmt) or die $DBI::errstr;

if( $ret < 0 ) {
   print STDERR $DBI::errstr;
} else {
   print STDERR "A total of $ret rows updated\n";
}

# 从表中删除某行
$stmt = qq(DELETE from NETWORK where ID=2;);
$ret = $dbh->do($stmt) or die $DBI::errstr;

if($ret < 0) {
   print STDERR $DBI::errstr;
} else {
   print STDERR "A total of $ret rows deleted\n";
}

# 断开数据库连接
$dbh->disconnect();
print STDERR "Exit the database\n";

上面的Perl脚本运行成功后会创建一个叫“xmodulo.db”的数据库文件,并会有下面的输出。

Database opened successfully
Table created successfully
ID: 1
HOSTNAME: xmodulo
OS: Ubuntu 14.10
CPULOAD: 0

ID: 2
HOSTNAME: bert
OS: CentOS 7
CPULOAD: 0

ID: 3
HOSTNAME: puppy
OS: Ubuntu 14.10
CPULOAD: 0

A total of 2 rows updated
A total of 1 rows deleted
Exit the database

错误定位

如果你尝试没有安装SQLite DBI驱动的情况下使用Perl访问SQLite的话,你会遇到下面的错误。你必须按开始说的安装DBI驱动。

Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./script.pl line 3.
BEGIN failed--compilation aborted at ./script.pl line 3.

via: http://xmodulo.com/access-sqlite-database-perl.html

作者:Dan Nanni 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

问题: 在Perl语言中,我需要转换易读的日期和时间到对应的UNIX时间戳,反之亦然。你可以给我一些将日期及时间转换到UNIX时间戳的Perl代码例子吗?或者相反,转换UNIX时间戳到可读的日期和时间。

当你的Perl脚本需要解决时间信息,这里有两种方法来表示和处理日期和时间。一种方法是易读的时间表示(例,"Sat Mar 14 10:14:05 EDT 2015"),另外一种是使用UNIX时间戳(也叫“新纪元时间”),这是从1970年1月1日到今所经过的时间秒数。每一种方法都有它自己的优劣势,取决于你的需要,也许也就需要转换一种格式到另一种。

Perl中转换本地时间到UNIX时间戳

为了从日期字符串中获得UNIX时间,可以使用Date::Parse模块中str2time()函数。此函数可以处理多种格式,例如:

  • Sat Mar 14 10:14:05 EDT 2015
  • 3/14/2015 10:14:05 -0400
  • 14/Mar/15 10:14:05
  • 14 Mar 15 10:14:05
use Date::Parse;

my $local_time = "Sat Mar 14 10:14:05 EDT 2015";

# 1426342445 will be stored in $unix_time
my $unix_time = str2time($local_time);

Date:Parse 模块支持多种语言(英语,法语,德语和意大利语)和时区。例如:

use Date::Parse;
use Date::Language;

my $lang = Date::Language->new('French');
my $unix_time = $lang->str2time("12:14:05, Ago 16, 2014 (CEST)");

Perl中UNIX时间戳到易读的日期和时间

如果你想要转换UNIX时间戳到易读的格式,可以使用localtime()函数,此函数可以转换UNIX时间戳为一个9元素列表。然后你可以使用返回的list构造任何你需要的可读格式。这里有一个代码片段:

# $sec, $min, $hour: 秒,分,时
# $mday: 月中的某天 (0-31)
# $mon: 月份,范围 0 (一月) 至 11 (十二月)
# $year: 年份,与1900年的差值(2015年为2015-1900=115)
# $wday: 星期,范围 0 (星期天) 至 6 (星期六)
# $yday: 年中的某天,范围 0 至 364 (或 365 闰年)
# $isdst: 是否是夏令时

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($unix_timestamp);

# necessary conversion of $mon and $year
$mon += 1;
$year += 1900;

print "Current time: $year-$mon-$mday $hour:$min:$sec\n";

via: http://ask.xmodulo.com/convert-local-time-unix-timestamp-perl.html

作者:Dan Nanni 译者:VicYu/Vic020 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

本书由Linux中国站长wxy & Linux中国翻译组译者Tinyeyeser共同翻译并亲力推荐,是通往Perl大师之路必读经典书籍,它体现了一种编程思维,能够帮你解决很多实际的问题。

活动内容

活动时间:2015年3月19日-2015年3月30日

活动要求:

活动形式一:在新浪微博转发本微博,并@ 一位你身边用过perl语言的人,即有机获赠本书。每转发过百,送出一本。

微博地址:http://weibo.com/1772191555/C9h43bNgW

活动形式二:在Linux中国(http://linux.cn)试读图书样张,并进行评论,或说说你喜爱perl的理由,分享一下使用perl 过程中遇到过哪些有趣/神奇的事情

活动奖品:《精通Perl(第2版)》图书一本。

特此注意:

1、本站论坛评论方式参与的用户,评论前需登录您的Linux中国账号,匿名评论无效

2、微博用户参与活动,活动结束后注意查看@Linux中国\_笑语彦然 微博公布的中奖名单或留意您的微博私信,本站用户参与活动,注意查看您注册Linux中国时所填写的邮箱。 我们会通过微博私信以及电子邮件两种方式获取您的邮寄信息。

基本信息

作者: (美)brian d foy

译者: 王兴宇 刘宸宇

出版社:电子工业出版社

ISBN:9787121254192

出版日期:2015 年3月

开本:16开

页码:395

版次:2-1

编辑推荐

  • 探索高级的正则表达式功能
  • 如何避免程序的常见安全问题
  • 对 Perl 程序的性能分析和基准测试可以让你发现改进之处
  • 清理 Perl 代码,使之更加直观和易读
  • 了解 Perl 如何持续跟踪软件包内的变量
  • 动态定义子程序
  • 不必改动原有代码即可提升模块
  • 使用位操作和位向量更有效地存储更大的数据
  • 学习如何检测 Perl 中未报告的错误
  • 深入学习日志、数据持久化和绑定变量的魔法

内容简介

《精通Perl(第2版)》作者brian d foy 用他生动的第一人称视角向各位读者介绍了精彩的Perl 高级语言知识以及丰富的实战工具与实用技巧。《精通Perl(第2版)》各章的内容相对独立,您完全可以根据自己的兴趣或需要直达你所需要的章节。
《精通Perl(第2版)》的读者主要面对具有较多经验的Perl 编程人员。阅读本书前,建议阅读本书的姊妹篇《Perl 语言入门》和《Perl 进阶》。作者在这本书里针对调试、优化、错误和日志等方面均有深入解析,也揭示了Perl 中如绑定变量、持久化存储等各种魔法般的特性和功能的实现细节和用途。书中还对如何开发、调试自己的模块,以及如何做出更适合使用的模块做了详细介绍。
总之,本书可以作为读者在向Perl 高手进阶过程中的一个助力器,希望读者能在阅读过程中深入思考,加入自己的理解,用Perl 来完成一件件神奇的事情。

作者简介

brian d foy是一名多产的 Perl 培训讲师和作家,其出版的 The Perl Review 帮助人们通过教育、咨询、代码审查等方面来学习和使用 Perl。

译者序

  --献给逝去的和新生的纪念
  作为译者,总是有一些特权,比如说,可以在翻译的书前面,用铅字写一些自己想说的话。当然,作为读者,您可能不喜欢,不过,请您谅解我们激动的心情,愿意的话,您可以看看我们的吐槽。
  我的父亲是一个传统的老知识分子,虽然我自己并不成器,但是他一直告诉我,要我写一些东西出来,留一些文字,因此能出版一些自己的文字一直是我心里长久的梦想。不过,我在各种方面的积淀还远远不够,所以直到现在也没有足以称道的文字可以出版。
  在一个偶然的机会,我得到了付睿老师的委托,和刘宸宇一同接下了这本《精通Perl》的翻译工作。虽然翻译工作和出版自己的文字还不同,但是我想这也是我给去世的父亲的一点纪念吧。
  Perl 我用了有十多年了吧,这门语言基本上算是我从事互联网行业以来第一门真正掌握和熟悉的语言了。最初是从一本薄薄的《Perl语言入门》,大约花了一周入门的。当时正值第一波的互联网热潮,工作方面使用Perl甚多,也陆续看过Perl方面的各种书籍,但是从来没有想到自己会有机会翻译一本Perl方面的书,更别说是这本经典Perl三部曲之一的《精通Perl》。
  虽然现在Perl用的比较少了,但是今年Larry Wall先生来华访问时,还是专门去朝觐了一番。然后不久,就接到了付睿老师的委托,可谓有缘。
  我平时的工作比较忙,而且也组织运作着一个翻译组:LCTT(Linux中国翻译组- http://lctt.github.io/),业余时间都占满了,所以当时对是否要接下翻译工作有些犹豫。我和LCTT的核心成员之一刘宸宇(tinyeyeser)商量了一番,感觉这个事情还是很有意义的,所以我们两个共同接下了对这本书的翻译工作。 王兴宇

  我要把这本书献给我刚出生的小天使,翻译完交稿不到10天,她便降临到我的世界里,成为了我生活中不可缺少的一部分。
  一直以来,我喜欢翻译对话、评论、调侃性质的技术博客等文章,钟情于感受那种面对面交流的感觉;而技术书籍这种相对较为正式的翻译,对于我来说,反而是件痛苦的事,哪怕只翻译半本(前言、附录及前8章)。但是当我真正深入本书,与brian d foy 正面交锋时,我发现,这不正是我所熟悉的面对面的对话吗?是的!不同于一般的技术书籍,大师的行文,几乎所有的主观句子都是以第一人称"I"开头,这就好像他坐在你面前,手把手讲授一样,生动、客观、幽默、立体!因此,我和王兴宇(wxy)在翻译的时候,把大部分"I"翻译成了"我们",这样既忠于作者的语境,也更贴合中国课堂上老师的讲课习惯。
  冯德伦的电影《太极》里有一句词:"人这一辈子,干好一件事就足够了"。我自认为不是一个有长性的人,一件事情很难坚持做到最好,总是觉得60分及格就可以了。因此,翻译过程中一度出现了厌烦情绪,但我很高兴自己成功坚持了下来。我要感谢几个月来,整个翻译过程中一直陪伴我督促我的媳妇儿,她怀着身孕,每当我消沉的时候,都会在我耳边给予
  我支持和鼓励,"翻译完了吗?翻译完了吗?赶紧翻译啊!好好翻译啊!"每个成功男人的背后,都有一个伟(lao)大(dao)的女人。我爱这个唠叨的女人! 刘宸宇

  Perl 作为老牌的编程语言,其成熟度和应用广泛令人称道,也是系统管理员和科研工作所必备的技能之一,因此,我们希望这本书的再版翻译,能够帮助读者进一步掌握Perl 语言的应用,也希望能够为开源社区反哺更多的智慧。
  将来,如果有机会,我们也希望这本书能够以某种开源方式,分享给社区,并接受社区的不断反馈和完善,成为一本真正有生命力的书籍。
  一本书的出版,其实要感谢很多人,虽然俗套,但是我们觉得依然有必要,占用一点小小的空间感谢他们: 感谢我们的家人的支持。 感谢我们的同事和领导的支持。 感谢编辑付睿老师的信任和委托。 感谢编辑李利健老师的辛勤审校。 感谢所有不知名的工作人员的辛勤工作。 王兴宇&刘宸宇

试读样章: 【第四章】 【第五章】

购买链接:http://product.china-pub.com/4594222

提问:我需要写一个Perl程序,它会包含Linux发行版相关的代码。为此,Perl程序需要能够自动检测运行中的Linux的发行版(如Ubuntu、CentOS、Debian、Fedora等等),以及它是什么版本号。如何用Perl检测Linux的发行版本?

如果要用Perl脚本检测Linux的发行版,你可以使用一个名为Linux::Distribution的Perl模块。该模块通过检查/etc/lsb-release以及其他在/etc下的发行版特定的目录来猜测底层Linux操作系统。它支持检测所有主要的Linux发行版,包括Fedora、CentOS、Arch Linux、Debian、Ubuntu、SUSE、Red Hat、Gentoo、Slackware、Knoppix和Mandrake。

要在Perl中使用这个模块,你首先需要安装它。

在Debian或者Ubuntu上安装 Linux::Distribution

基于Debian的系统直接用apt-get安装

$ sudo apt-get install liblinux-distribution-packages-perl 

在Fedora、CentOS 或者RHEL上安装 Linux::Distribution

如果你的Linux没有Linux::Distribution模块的安装包(如基于红帽的系统),你可以使用CPAN来构建。

首先确保你的Linux系统安装了CPAN

$ sudo yum -y install perl-CPAN 

然后,使用这条命令来构建并安装模块:

$ sudo perl -MCPAN -e 'install Linux::Distribution' 

用Perl确定Linux发行版

Linux::Distribution模块安装完成之后,你可以使用下面的代码片段来确定你运行的Linux发行版本。

use Linux::Distribution qw(distribution_name distribution_version);

my $linux = Linux::Distribution->new;

if ($linux) {
  my $distro = $linux->distribution_name();
  my $version = $linux->distribution_version();
  print "Distro: $distro $version\n";
}
else {
  print "Distro: unknown\n";
}

via: http://ask.xmodulo.com/detect-linux-distribution-in-perl.html

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出