标签 Perl 下的文章

近日召开的 Perl 大会是在云端举办的,在会上 Sawyer X 宣布 Perl 有了新的前进计划。Perl 7 的开发工作已经在进行中,但不会有代码或语法上的巨大变化。它是默认带有现代行为的 Perl 5,将为以后更大的变化奠定基础。

硬核老王:在经历了 Perl 6 失败的巨大痛苦之后,Perl 社区终于从阴霾的心情中走出了。但是失去的黄金 20 年却是挽回不了了,否则别说 PHP,都不会有 Python 什么事。我认为,Perl 7 是一条自我救赎之路,应该,或许,会有新的 Perl 7、Perl 8 吧……

Perl 7 基本上是 Perl 5.32

Perl 7.0 将会是 Perl 5 系列的 5.32,但会有不同的、更合理的、更现代的默认行为。你不需要启用大多数你已经设置过的默认行为,因为这些已经为你启用了。这个大版本跳跃为我们一直以来的工作方式和未来可以做的事情之间设定了一个界限。

硬核老王:可以理解为,Perl 是一个 Perl 5 兄弟们亲手打下的家族企业,而 Perl 6 是外面请来的职业经理人,结果经理人要对家族企业采用现代化管理,差点鸡飞蛋打。现在好了,Perl 6 分家出去单过了,亲儿子 Perl 7 准备重振家业。

请记住,Perl 是一门“按我的意思做”的语言,其默认行为可能就是你想要的。在 Perl 4 和 Perl 5 的早期,这很容易。但是,几十年过去了,现在的世界更加复杂了。我们不断地往其中添加编译指令,但由于 Perl 对向后兼容的承诺,我们不能改变其默认行为。现在,我们又回到了 C 语言的旧时代,在开始做一些事情之前,我们必须包含大量的例行模板:

use utf8;
use strict;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);

这一点在 v5.12 及以后的版本中稍有好转,因为我们可以通过使用设置最低版本来免去设置 strict 指令:

use v5.32;
use utf8;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);
硬核老王:不可否认,Perl 二十年前如日中天,那个时候,不说终端运行的脚本,就是互联网上主要的互动程序(CGI),也几乎全是用 Perl 写的。但是在风口时代它的主要精力都在折腾 Perl 6,而 Perl 5 系列不但很多地方显得老旧,历史包袱也过重。向前不能保持原有的精巧习惯,向后不能跟上现代的软工理念。

Perl 7 是一个新的机会,即使不指定版本,也可以把其中的一些行为变成默认行为。Perl 5 仍然有它的极度向后兼容的行为,但 Perl 7 将以最小的历史包袱获得现代实践的新生。我个人希望 签名 signatures 功能能够入选到新的版本,但要让 Unicode 成为默认行为还有很多工作要做,所以你可能需要保留其中的一些编译指令:

use utf8;
use open qw(:std :utf8);

你可能会丢掉一些你肯定不应该使用的垃圾功能,比如间接对象表示方式。Larry Wall 说他必须为 C++ 程序员做点什么。

my $cgi = new CGI;  # 间接对象,但在 Perl 7 不这样用了
my $cgi = CGI->new; # 直接对象

但是,这个功能在 Perl 7 中并没有真正消失。它在 v5.32 中已经可以通过设置关闭了,但现在有了不同的默认行为。

Perl 5 怎么了?

没有人要把 Perl 5 从你身边夺走,它将进入长期维护模式 —— 比最新用户版本的两年滚动支持时间的两倍都要长得多。这可能要从现在支持到十年后了(或者说 Perl 5 已经人过中年了)。

硬核老王:这样挺好,旧时代的继续留在旧时代,新生代的轻装前行。

什么时候开始?

这项工作现在就在进行,但你不需要担心,大约六个月后,才会出现第一个候选版本。我们的目标是在明年发布 Perl 7.0 的用户版本,并在这期间发布一些候选版本。

这也是一个容易实现的承诺,因为 Perl 7 基本上就是 v5.32,默认行为不同而已。没有大的重写,也没新的功能,尽管目前一些实验性的功能可能会稳定下来(请把“签名”功能选入!)。

CPAN 怎么办?

CPAN( 综合 Perl 档案网 Comprehensive Perl Archive Network )有近 20 万个模块。人们正在使用的处于维护状态的模块应该还能用,对于其它的模块会有一个兼容模式。记住 Perl 7 主要是 v5.32,所以你应该不需要修改太多。

你可能不知道 Perl5 Porters 几乎会针对所有的 CPAN 模块测试其新版本。这个用于检查更改可能对 Perl 社区产生影响的工具已有很长的历史了。作为一个模块的作者,我经常会收到来自不同人的消息,主要是 Andreas Koenig 或 Slaven Rezić,他们说我的模块中的一些奇怪的东西可能会在新的 Perl 版本中出问题。通常,我总是需要更新一些东西来解决这些问题。追踪现有代码中的问题已经不是问题了。修复代码应该不会那么繁琐,因为它仍然是 Perl 5,但有更好的实践。

硬核老王:知道当年 Perl 为什么强悍吗?有一个主要的原因是,Perl 有个无所不包的 CPAN 仓库。

会不会有一个单独的 Perl 7 的 CPAN?没有人说不能有,但是在跳转到 Perl 7 的过程中,开发人员不希望重做已经可以工作的东西。这个变化应该是可以控制的,尽量减少副作用。

另外,PAUSE( Perl 作者上载服务器 Perl Authors Upload Server )在过去的几年里得到了不少人的喜爱。这使他们可以更容易适应未来的需要。从事这方面工作的人都是经验丰富、才华横溢的人,他们让代码库变得更加容易管理。

为什么要跳到大版本?

一个主要版本可以与用户订立不同的契约。跳转到一个主要版本可以用新的默认行为来改变这个契约,即使这与过去有冲突。如果你愿意的话,总会有办法将所有这些设置都重置为旧的 Perl 5 默认行为。不过在语法和行为上,Perl 7 的代码(大部分)仍然是 v5.32 的代码。

Sawyer 谈到了 Perl 用户的三个主要细分市场:

  • 绝不会改变他们的代码的人
  • 使用新功能的人
  • 从零开始的人

Perl 5 的社会契约是 极度后向兼容 extreme backward compatibility ,并且在这方面取得了惊人的成功。问题是,极度后向兼容对那些不会更新代码的人有效,但对另外两部分人没有帮助。要使用新功能的人不得不在每个程序中加入挺长的例行模板部分,而从零开始的人们则想知道为什么他们创建一个程序就必须包含这么多,才能不让 StackOverflow 上的人因为少了那些编译指令而呵斥他们。

硬核老王:迎合新血才是最重要的,让旧代码和旧人们自己过吧。

为什么是 7,而不是 6?

这个答案分为两部分。 首先,“Perl 6” 已经被现在称为 Raku 的产品所采用。很久以前,我们认为这件非常雄心勃勃的重写工作将取代 v5.8。但最后,这件事并没有发生,Perl 语言依旧继续过着自己的生活。

因此,下一个可用数字为 7。如此而已。这只是序列中的下一个基数。版本跳跃这事情并不稀奇:PHP 直接从 5 升到了 7 —— 难道是我们从 PHP 社区偷学到的跳跃技能?看看一下历史上的其他奇怪的版本变化:

  • 从 Solaris 2.6 到 Solaris 7
  • 从 Java 1.4 至 Java 5
  • 从以 Postgres 9.x 为主要版本变成了以 Postgres 10 为主要版本
  • Windows 3.1 至 Windows 95(98、ME、2000、XP、Vista、7、8、10)
  • TeX(每个新版本都更趋近于圆周率 π )

至少我们没跳到 Perl 34!

硬核老王:言外之意,你们跳得,我也跳得~而且,你们不觉得版本 6 这个数字有点不吉利么,而版本 7 这个数字就好多了。

有什么消失了么?

消失的东西不多。有些东西在默认情况下会被禁用,但同样,这本质上是调整旋钮和拨盘指向不同地方的 Perl 5.32。即使在 Perl 5 的土地上,有些东西你也应该学会不需要。以下这些都是第一轮变化的可能目标:

  • 间接对象符号
  • 裸词文件柄(标准文件柄除外)
  • 伪多维数组和哈希值(老的 Perl 4 花招)
  • Perl 4 风格的原型定义(使用 :prototype() 代替)
硬核老王:是该学会放弃了,又不是区块链,什么旧的都不能丢下。

增加了什么?

增加的也不多。Perl 7 主要是 Perl v5.32,但默认启用了所有的功能。你不需要做任何事情就可以获得大多数新功能,比如postfix 解引用,新的 isa 操作符,或者其他一些功能。这就是一个主要版本可以提供的新社会契约的好处。这是一个硬边界,新功能可以在一边默认存在,而不干扰另一边。

硬核老王:多增加点新的编程语言技能吧!哪怕是语法糖。

那我现在应该做什么?

如果你需要一个旧版的 Perl 来运行你的代码,你继续好了。那些旧版本是不会消失的。就像 Perl 5.6 到现在仍然可以使用,如果那是你希望运行的版本的话。

如果你的代码在那些约束和警告下运行没有问题,而且你使用的是现代 Perl 风格,可能你大部分代码都不用动。如果你有一些裸词的文件柄,就开始转换这些,间接对象符号也一样。

如果你的代码比较凌乱,你也不是没有机会。在从 Perl 5 到 7 的过渡过程中,会有兼容模式来帮助你(但不是 Perl 5 到 8)。一个编译指令可以把那些旋钮和拨盘设置回旧的设置(但这最多也就是一个版本的事情)。

use compat::perl5;  # 行为类似 Perl 5 的默认行为

对于模块来说,还有一些问题需要解决,但也会有一个兼容机制来解决这些问题。

硬核老王:代码实在写的烂(辩解:我这不是烂,是 Perl 的古怪传统),那没办法,只能给你一次机会。

好消息是,这些东西已经被主要的 Perl 利益相关者在生产环境中进行了测试。这不是纸上谈兵:我们已经在做了,一些粗陋的地方正在调整打磨。

而且,v5.32 中已经有了一些这些旋钮和拨盘,比如,你可以这样关闭间接对象表示:

no feature qw(indirect);

预期会有更多的旋钮或拨盘,或许像这样:

no multidimensional;
no bareword::filehandle;

我在《为 Perl 7 做准备》一书中收集了所有这些信息,这是我通过 Perl School 和 LeanPub 提供的最新产品。

硬核老王:本文作者 brian d foy 也是《 精通 Perl Mastering Perl 》 的作者,我是这本书是中文译者之一。

一句话总结

Perl 7 是 v5.32,设置不同而已。你的代码如果不是乱七八糟的,应该可以用。预计一年内会有用户发布。

硬核老王:作为一个老 Perl 程序员,这个消息让我又动心了,认真考虑是不是再投回 Perl 的怀抱,哦不,是 Perl 7 的怀抱。

用 Perlbrew 在你系统上安装多个版本的 Perl。

有比在系统上安装了 Perl 更好的事情吗?那就是在系统中安装了多个版本的 Perl。使用 Perlbrew 你可以做到这一点。但是为什么呢,除了让你包围在 Perl 下之外,有什么好处吗?

简短的回答是,不同版本的 Perl 是......不同的。程序 A 可能依赖于较新版本中不推荐使用的行为,而程序 B 需要去年无法使用的新功能。如果你安装了多个版本的 Perl,则每个脚本都可以使用最适合它的版本。如果您是开发人员,这也会派上用场,你可以针对多个版本的 Perl 测试你的程序,这样无论你的用户运行什么,你都知道它能否工作。

安装 Perlbrew

另一个好处是 Perlbrew 会安装 Perl 到用户的家目录。这意味着每个用户都可以管理他们的 Perl 版本(以及相关的 CPAN 包),而无需与系统管理员联系。自助服务意味着为用户提供更快的安装,并为系统管理员提供更多时间来解决难题。

第一步是在你的系统上安装 Perlbrew。许多 Linux 发行版已经在包仓库中拥有它,因此你只需要 dnf install perlbrew(或者适用于你的发行版的命令)。你还可以使用 cpan App::perlbrew 从 CPAN 安装 App::perlbrew 模块。或者你可以在 install.perlbrew.pl 下载并运行安装脚本。

要开始使用 Perlbrew,请运行 perlbrew init

安装新的 Perl 版本

假设你想尝试最新的开发版本(撰写本文时为 5.27.11)。首先,你需要安装包:

perlbrew install 5.27.11

切换 Perl 版本

现在你已经安装了新版本,你可以将它用于该 shell:

perlbrew use 5.27.11

或者你可以将其设置为你帐户的默认 Perl 版本(假设你按照 perlbrew init 的输出设置了你的配置文件):

perlbrew switch 5.27.11

运行单个脚本

你也可以用特定版本的 Perl 运行单个命令:

perlberew exec 5.27.11 myscript.pl

或者,你可以针对所有已安装的版本运行命令。如果你想针对各种版本运行测试,这尤其方便。在这种情况下,请指定版本为 perl

plperlbrew exec perl myscriptpl

安装 CPAN 模块

如果你想安装 CPAN 模块,cpanm 包是一个易于使用的界面,可以很好地与 Perlbrew 一起使用。用下面命令安装它:

perlbrew install-cpanm

然后,你可以使用 cpanm 命令安装 CPAN 模块:

cpanm CGI::simple

但是等下,还有更多!

本文介绍了基本的 Perlbrew 用法。还有更多功能和选项可供选择。从查看 perlbrew help 的输出开始,或查看App::perlbrew 文档。你还喜欢 Perlbrew 的其他什么功能?让我们在评论中知道。


via: https://opensource.com/article/18/7/perlbrew

作者:Ben Cotton 选题:lujun9972 译者:geekpi 校对:wxy

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

这个简单优雅的模块可以让你包含调试或仅用于开发环境的代码,而在产品环境中隐藏它们。

仅用于调试或开发调整时的 Perl 代码块有时会很有用。这很好,但是这样的代码块可能会对性能产生很大的影响, 尤其是在运行时才决定是否执行它。

Curtis "Ovid" Poe 最近编写了一个可以帮助解决这个问题的模块:Keyword::DEVELOPMENT。该模块利用 Keyword::Simple 和 Perl 5.012 中引入的可插入关键字架构来创建了新的关键字:DEVELOPMENT。它使用 PERL_KEYWORD_DEVELOPMENT 环境变量的值来确定是否要执行一段代码。

使用它不能更容易了:

use Keyword::DEVELOPMENT;

sub doing_my_big_loop {
    my $self = shift;
    DEVELOPMENT {
        # insert expensive debugging code here!
    }
}

在编译时,DEVELOPMENT 块内的代码已经被优化掉了,根本就不存在。

你看到好处了么?在沙盒中将 PERL_KEYWORD_DEVELOPMENT 环境变量设置为 true,在生产环境设为 false,并且可以将有价值的调试工具提交到你的代码库中,在你需要的时候随时可用。

在缺乏高级配置管理的系统中,你也可以使用此模块来处理生产和开发或测试环境之间的设置差异:

sub connect_to_my_database {

    my $dsn = "dbi:mysql:productiondb";
    my $user = "db_user";
    my $pass = "db_pass";

    DEVELOPMENT {
        # Override some of that config information
        $dsn = "dbi:mysql:developmentdb";
    }

    my $db_handle = DBI->connect($dsn, $user, $pass);
}

稍后对此代码片段的增强使你能在其他地方,比如 YAML 或 INI 中读取配置信息,但我希望您能在此看到该工具。

我查看了关键字 Keyword::DEVELOPMENT 的源码,花了大约半小时研究,“天哪,我为什么没有想到这个?”安装 Keyword::Simple 后,Curtis 给我们的模块就非常简单了。这是我长期以来在自己的编码实践中所需要的一个优雅解决方案。


via: https://opensource.com/article/18/4/perl-module-debugging-code

作者:Ruth Holloway 选题:lujun9972 译者:geekpi 校对:wxy

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

树莓派,随心所欲。

 title=

我最近在 SVPerl (硅谷 Perl 聚会)谈到在树莓派上运行 Perl 语言的时候,有人问我,“我听说树莓派应该使用 Python ,是这样吗?”。我非常乐意回答他,这是个常见误解。树莓派可以支持任何语言: Python、Perl 和其他树莓派官方软件 Raspbian Linux 初始安装的语言。

看似很厉害,其实很简单。树莓派的创造者英国的计算机科学教授 Eben Upton 曾经说过,树莓派名字中的‘派’(pi),是想为了听起来像 Python,因为他喜欢这门语言。他选择了这门语言作为孩子们的启蒙语言。但是他和他的团队做了一个通用计算机。开源软件没给树莓派任何限制。我们想运行什么就运行什么,全凭自己心意。

我在 SVPerl 和这篇文章中还想讲第二点,就是介绍我的 “PiFlash” 脚本。虽然它是用 Perl 写的,但是不需要你有多了解 Perl 就可以在 Linux 下将树莓派系统自动化烧录到 SD 卡。这样对初学者就比较友好,避免他们在烧录 SD 卡时候,偶然擦除了整个硬盘。即使是高级用户也可以从它的自动化工作中受益,包括我,这也是我开发这个工具的原因。在 Windows 和 Mac 下也有类似的工具,但是树莓派网站没有介绍类似工具给 Linux 用户。不过,现在有了。

开源软件早就有自己造轮子的传统,因为他们总是崇尚“自痒自挠”去解决问题。这种方式在 Eric S 1997 年的论文和 1999 年的书籍《大教堂与集市》中早有提及,它定义了开源软件的方法论。我也是为了满足想我这样的 Linux 用户,所以写了这个脚本。

下载系统镜像

想要开启树莓派之旅,你首先需要为它下载一个操作系统。我们称之为“系统镜像”文件。一旦你把它下载到你的桌面、手提电脑,或者甚至是另一个树莓派中,我就需要写入或者称之为“烧录”进你的 SD卡。详细情况可以看在线文件。手动做这件事情需要一些功底,你要把系统镜像烧录到整个 SD卡,而不是其中一块分区。系统镜像必须独自包含至少一个分区,因为树莓派引导需要一个 FAT32文件系统分区,系统引导这里开始。除了引导分区,其他分区可以是操作系统内核支持的任何分区类型。

在大部分树莓派中,我们都运行的是某些使用 Linux 内核的发行版。已经有一系列树莓派中常用的系统镜像你可以下载使用。(当然,没什么能阻止你自己造轮子)

树莓派基金会向新手推荐的是“NOOBS”系统。它代表了 “New Out of the Box System”(新鲜出炉即开即用系统),显然它好像听起来像术语 “noob"”(小白),通俗点说就是 “newbie”(菜鸟)。NOOBS 是一个基于树莓派的 Linux 系统,它会给你一个菜单可以在你的树莓派上自动下载安装几个其它的系统镜像。

Raspbian Linux 是 Debian Linux 发行版的树莓派定制版。它是为树莓派开发的正式 Linux 发行版,并且由树莓派基金会维护。几乎所有树莓派驱动和软件都会在 Raspbian 上先试用,然后才会放到其它发行版上。其默认安装博客 Perl。

Ubuntu Linux (还有其社区版的 Ubuntu MATE)也将树莓派作为其支持 ARM (Advanced RISC Machines)处理器的平台之一。RISC(Reduced Instruction Set Computer)Ubuntu 是一个 Debian Linux 的商业化支持的开源分支,它也使用 DEB 包管理器。Perl 也在其中。它仅仅支持 32 位 ARM7 或者 64 位 ARM8 处理器的树莓派 2 和 3。ARM6 的树莓派 1 和 Zero 从未被 Ubuntu 构建过程支持。

Fedora Linux 支持树莓派2 ,而 Fedora 25 支持 3。 Fedora 是一个隶属于红帽(Red Hat)的开源项目。Fedora 是个基础,商业版的 RHEL(Red Hat Enterprise Linux)在其上增加了商业软件包和支持,所以其软件像所有的兼容红帽的发行版一样来自 RPM(Red Hat Package Manager) 软件包。就像其它发行版一样,也包括 Perl。

RISC OS 是一个特别针对 ARM 处理器的单用户操作系统。如果你想要一个比 Linux 系统更加简洁的小型桌面(功能更少),你可以考虑一下。它同样支持 Perl。

RaspBSD 是一个 FreeBSD 的树莓派发行版。它是一个基于 Unix 的系统,而不是 Linux。作为开源 Unix 的一员,它延续了 Unix 的功能,而且和 Linux 有着众多相似之处。包括有类似的开源软件带来的相似的系统环境,包括 Perl。

OSMC,即开源多媒体中心,以及 LibreElec 电视娱乐中心,它们都基于运行 Linux 内核之上的 Kodi 娱乐中心。它是一个小巧、特化的 Linux 系统,所以不要期望它能支持 Perl。

Microsoft Windows IoT Core 是仅运行在树莓派3上的新成员。你需要微软开发者身份才能下载。而作为一个 Linux 极客,我根本不看它。我的 PiFlash 脚本还不支持它,但如果你找的是它,你可以去看看。

PiFlash 脚本

如果你想看看树莓派 SD 卡烧录指导,你可以找到在 Windows 或者 Mac 系统下需要下载的工具来完成烧录任务。但是对于 Linux 系统,只有一系列手工操作建议。我已经手工做过这个太多次,这很容易引发一个开发者的本能去自动化这个过程,这就是 PiFlash 脚本的起源。这有点难,因为 Linux 有太多方法可以配置,但是它们都是基于 Linux 内核的。

我总是觉得,手工操作潜在最大的失误恐怕就是偶然错误地擦除了某个设备,而不是擦除了 SD 卡,然后彻底清除了我本想保留在硬盘的东西。我在 SVPerl 演讲中也说了,我很惊讶地发现在听众中有犯了这种错误(而且不害怕承认)的人。因此,PiFlash 其中一个目的就是保护新手的安全,不会擦除 SD 卡之外的设备。PiFlash 脚本还会拒绝覆写包含了已经挂载的文件系统的设备。

对于有经验的用户,包括我,PiFlash 脚本还提供提供一个简便的自动化服务。下载完系统镜像之后,我不需要必须从 zip格式中解压缩或者提取出系统镜像。PiFlash 可以直接提取它,不管是哪种格式,并且直接烧录到 SD 卡中。

我把 PiFlash 及其指导发布在了 GitHub 上。

命令行用法如下:

piflash [--verbose] input-file output-device
piflash [--verbose] --SDsearch

input-file 参数是你要写入的系统镜像文件,只要是你从树莓派发行版网站下载的镜像都行。output-device 参数是你要写入的 SD 卡的块设备路径。

你也可以使用 --SDsearch 参数列出挂载在系统中 SD 卡设备名称。

可选项 --verbose 可以输出所有的程序状态数据,它在你需要帮助时或者递送 bug 报告和自行排错时很有用。它就是我开发时用的。

下面的例子是我使用该脚本写入仍是 zip 存档的 Raspbian 镜像到位于 /dev/mmcblk0 的 SD 卡:

piflash 2016-11-25-raspbian-jessie.img.zip /dev/mmcblk0

如果你已经指定了 /dev/mmcblk0p1 (SD 卡的第一分区),它会识别到这个分区不是一个正确的位置,并拒绝写入。

在不同的 Linux 系统中怎样去识别哪个设备是 SD 卡是一个技术活。像 mmcblk0 这种在我的笔记本上是基于 PCI 的 SD卡接口。如果我使用了 USB SD 卡接口,它就是 /dev/sdb,这在多硬盘的系统中不好区分。然而,只有少量的 Linux 块设备支持 SD 卡。PiFlash 在这两种情况下都会检查块设备的参数。如果全部失败,它会认为可写入、可移动的,并有着正确物理扇区数量的 USB 驱动器是 SD 卡。

我想这应该能涵盖大部分情况。但是,如果你使用了我不知道的 SD 卡接口呢?我乐意看到你的来信。请在输出信息中加上 --verbos --SDsearch 参数,以便让我可以知道你系统目前的环境。理想情况下,如果 PiFlash 脚本可以被广泛利用,我们可以构建一个开源社区去尽可能的帮助更多的树莓派用户。

树莓派的 CPAN 模块

CPAN(Comprehensive Perl Archive Network)是一个世界范围内包含各种 Perl 模块的的下载镜像。它们都是开源的。大量 CPAN 中的模块都是历久弥坚。对于成千上百的任务,你不需要重复造轮子,只要利用别人已经发布的代码就可以了。然后,你还可以提交你的新功能。

尽管树莓派是个五脏俱全的 Linux 系统,支持大部分 CPAN 模块,但是这里我想强调一下专为树莓派硬件开发的东西。一般来说它们都用在测量、控制、机器人方面的嵌入式系统中。你可以通过 GPIO (General-Purpose Input/Output)针脚将你的树莓派连接到外部电子设备。

可以使用树莓派 GPIO 针脚的模块如下:Device::SMBusDevice::I2CRpi::PIGPIORpi::SPIRpi::WiringPiDevice::WebIO::RaspberryPIDevice::PiGlow。树莓派支持的嵌入式模块如下:UAV::Pilot::Wumpus::Server::Backend::RaspberryPiI2CRPI::DHT11(温度/湿度)、RPI::HCSR04(超声波)、App::RPI::EnvUIRPi::DigiPot::MCP4XXXXRPI::ADC::ADSDevice::PaPiRusDevice::BCM2835::Timer

例子

这里有些我们在树莓派上可以用 Perl 做的事情的例子。

例一:在 OSMC 使用 PiFlash 播放视频

本例中,你将练习如何设置并运行使用 OSMC 操作系统的树莓派。

  • RaspberryPi.Org 下载区,下载最新的 OSMC 版本。
  • 将空 SD 卡插入你的 Linux 电脑或者笔记本。树莓派第一代是全尺寸的 SD 卡,除此以外都在使用 microSD,你也许需要一个通用适配器才能插入它。
  • 在插入前后分别运行 cat /proc/partitions 命令来看看系统分给硬件的设备名称。它可能像这样 /dev/mmcblk0 或者 /dev/sdb, 用如下命令将正确的系统镜像烧录到 SD 卡:piflash OSMC_TGT_rbp2_20170210.img.gz /dev/mmcblk0
  • 弹出 SD 卡,将它插入树莓派中,接上 HDMI 显示器,开机。
  • 当 OSMC 设置完毕,插入一个 USB 设备,在里面放点视频。出于示范目的,我将使用 youtube-dl 程序下载两个视频。运行 youtube-dl OHF2xDrq8dY (彭博关于英国高新产业,包括树莓派的介绍)还有 youtube-dl nAvZMgXbE9c (CNet 发表的“排名前五的树莓派项目”) 。将它们下载到 USB 中,然后卸载移除设备。
  • 将 USB 设备插入到 OSMC 树莓派。点击视频选项进入到外部设备。
  • 只要你能在树莓派中播放视频,那么恭喜你,你已经完成了本次练习。玩的愉快。

例二:随机播放目录中的视频的脚本

这个例子将使用一个脚本在树莓派上的目录中乱序播放视频。根据视频的不同和设备的摆放位置,这可以用作信息亭显示的用途。我写这个脚本用来展示室内体验视频。

  • 设置树莓派引导 Raspbian Linux。连接到 HDMI 监视器。
  • 从 GitHub 上下载 do-video 脚本。把它放到树莓派中。
  • 跟随该页面的安装指导。最主要的事情就是安装 omxplayer 包,它可以使用树莓派硬件视频加速功能平滑地播放视频。
  • 在家目录的 Videos 目录下放一些视频。
  • 运行 do-video ,这样,应该就可以播放视频了

例三:读取 GPS 数据的脚本

这个例子更加深入,更有针对性。它展示了 Perl 怎么从外部设备中读取数据。在先前例子中出现的我的 GitHub上 “Perl on Pi” 有一个 gps-read.pl 脚本。它可以通过一系列端口从 GPS 读取 NMEA(国家海洋电子协会)的数据。页面还有教程,包括构建它所使用的 AdaFruit Industries 部分,但是你可以使用任何能输出 NMEA 数据的 GPS。

通过这些任务,我想你应该可以在树莓派上像使用其他语言一样使用 Perl了。希望你喜欢。


作者简介:

Ian Kluft - 上学开始,Ian 就对喜欢编程和飞行。他一直致力于 Unix 的工作。在 Linux 内核发布后的六个月他转向了 Linux。他有计算机科学硕士学位,并且拥有 CSSLP 资格证(认证规范开发流程专家),另一方面,他还是引航员和认证的飞机指令长。作为一个超过二十五年的认证的无线电爱好者,在近些年,他在一些电子设备上陆续做了实验,包括树莓派。


via: https://opensource.com/article/17/3/perl-raspberry-pi

作者:Ian Kluft 译者:Taylor1024 校对:wxy

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

(LCTT 译注:本文标题 “The root of all eval” 影射著名歌曲“The root of all evil”(万恶之源))

唉,eval 这个函数让我爱恨交织,而且多半是后者居多。

$ perl -E'my $program = q[say "OH HAI"]; eval $program'
OH HAI

eval 函数在 Perl 6 中被重命名为 EVAL 时,我感到有点震惊(这要追溯到 2013 年,在这里讨论规范之后)。我一直没有从内心接受这样这样的做法。虽然这是个很好的意见,但是在这个意见上我似乎或多或少是孤独的。

理由是“这个函数真的很奇怪,所以我们应该用大写标记”。就像我们用 BEGIN 和其他 phaser 一样。使用 BEGIN 和其他 phaser,鼓励使用大写,这点我是同意的。phaser 能将程序“脱离正常控制流”。 但是 eval 函数并不能。(LCTT 译注: 在 Perl 6 当中,phaser 是在一个特定的执行阶段中调用的代码块。)

其他大写的地方像是 .WHAT 这样的东西,它看起来像属性,但是会在编译时将代码变成完全不同的东西。因为这发生在常规情况之外,因此大写甚至是被鼓励的。

eval 归根到底是另一个函数。是的,这是一个潜在存在大量副作用的函数。但是那么多的标准函数都有大量的副作用。(举几个例子:shelldieexit)你没看到有人呼吁将它们大写。

我猜有人会争论说 eval 是非常特别的,因为它以正常函数所没有的方式钩到编译器和运行时里面。(这也是 TimToady 在将该函数重命名的提交中的提交消息中解释的。)这是一个来自实现细节的争论,然而这并不令人满意。这也同样适用与刚才提到的那些小写函数。

雪上加霜的是,更名后 EVAL 也更难于使用:

$ perl6 -e'my $program = q[say "OH HAI"]; EVAL $program'
===SORRY!=== Error while compiling -e
EVAL is a very dangerous function!!! (use the MONKEY-SEE-NO-EVAL pragma to override this error,
but only if you're VERY sure your data contains no injection attacks)
at -e:1
------> program = q[say "OH HAI"]; EVAL $program⏏<EOL>

$ perl6 -e'use MONKEY-SEE-NO-EVAL; my $program = q[say "OH HAI"]; EVAL $program'
OH HAI

首先,注入攻击是一个真实的问题,并不是一个笑话。我们应该互相教育对方和新手。

其次,这个错误消息("EVAL is a very dangerous function!!!")完全是恐吓多于帮助。我觉得当我们向人们解释代码注入的危险时,我们需要冷静并且切合实际,而不是用三个感叹号。这个错误信息对已经知道什么是注入攻击的人来说是有意义的,对于那些不了解这种风险的人员,它没有提供任何提示或线索。

(Perl 6 社区并不是唯一对 eval 歇斯底里的,昨天我偶然发现了一个 StackOverflow 主题,关于如何将一个有类型名称的字符串转换为 JavaScript 中的相应构造函数,一些人不幸地提出了用 eval,而其他人立即集结起来指出这是多么不负责任,就像膝跳反射那样——“因为 eval 是坏的”)。

第三,“MOKNEY-SEE-NO-EVAL”。拜托,我们能不能不要这样……汗,启用一个核弹级的函数时,就像是猴子般的随机引用和轻率的尝试,我奇怪地发现启用 EVAL 函数的是一个称为 NO-EVAL 的东西。这并不符合“ 最少惊喜 Least Surprise ”原则。

不管怎样,有一天,我意识到我可以同时解决全大写名字问题和该指令的必要问题:

$ perl6 -e'my &eval = &EVAL; my $program = q[say "OH HAI"]; eval $program'
OH HAI

我很高兴我能想到这点子并记录下来。显然我们把它改回了旧名字,这个非常危险的功能(!!!)就又好了。 耶!


via: http://strangelyconsistent.org/blog/the-root-of-all-eval

作者:Carl Mäsak 译者:geekpi 校对:wxy

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

在新闻组和邮件列表里、在计算机科学实验室里、在各大陆之间,流传着一个神秘的故事,那是关于 Perl 与动态网站之间的不得不说的往事。

早期互联网历史中,有一些脍炙人口的开创性事件:如 蒂姆·伯纳斯·李 Tim Berners-Lee 在邮件组上宣布 WWW-project 的那天,该文档随同 CERN 发布的项目代码进入到了公共域,以及 1993 年 1 月的第一版 NCSA Mosaic 浏览器。虽然这些独立的事件是相当重要的,但是当时的技术的开发已经更为丰富,不再是由一组的孤立事件组成,而更像是一系列有内在联系的故事。

这其中的一个故事描述的是网站是如何变成动态的,通俗说来就是我们如何使服务器除了提供静态 HTML 文档之外做更多的事。这是个流传在新闻组和邮件列表间、计算机科学实验室里、各个大陆之间的故事,重点不是一个人,而是一种编程语言:Perl。

CGI 脚本和信息软件

在上世纪 90 年代中后期,Perl 几乎和动态网站是同义词。Perl 是一种相对来说容易学习的解释型语言,并且有强大的文本处理特性,使得它能够很容易的编写脚本来把一个网站关联到数据库、处理由用户发送的表单数据,当然,还要创造那些上世纪 90 年代的网站的经典形象——计数器和留言簿。

类似的网站特性渐渐的变成了 CGI 脚本的形式,其全称为 通用网关接口 Common Gateway Interface 首个实现由 Rob McCool 于 1993 年 11 月在 NCSA HTTPD 上完成。CGI 是目的是直面功能,并且在短短几年间,任何人都可以很容易的找到一些由 Perl 写的预制的脚本存档。有一个声名狼籍的案例就是 Matt's Scripts Archive,这是一种流行却包含各种安全缺陷的源代码库,它甚至使得 Perl 社区成员创建了一种被称为 Not Matt‘s Scripts 的更为专业的替换选择。

在当时,无论是业余爱好者,还是职业程序员都采用 Perl 来制作动态网站和应用,Tim O’Reilly 创造了词汇 “信息软件” infoware 来描述网站和 Perl 怎样成为变化中的计算机工业的一部分。考虑到 Yahoo!和 Amazon 带来的创新,O‘Reilly 写道:“传统软件在大量的软件中仅仅包含了少量的信息;而信息软件则在少量的软件中包含了大量的信息。” Perl 是一种像瑞士军刀一样的完美的小而强大的工具,它支撑了信息媒体从巨大的网站目录向早期的用户生成内容(UGC)平台的转变。

题外话

尽管使用 Perl 来制作 CGI 简直是上佳之选,但是编程语言和不断提升中的动态网站之间的关系变得更加的密切与深入。从第一个网站(在 1990 年的圣诞节前)出现到 1993 年 McCool 实现 CGI 的短暂时期内,Web 上的各种东西,比如表单、图片以及表格,就这么逐渐出现在上世纪 90 年代乃至后来。尽管伯纳斯·李也对这些早期的岁月产生了影响,但是不同的人看到的是 Web 不同的潜在作用,并将它推向各自不同的方向。一方面,这样的结果来自一些著名的辩论,例如 HTML 应该和 SGML 保持多近的关系是否应该实现一个图像标签等等。在另一方面,在没有直接因素影响的情况下改变是极其缓慢的。后者已经很好的描述了动态网站是如何发展的。

从某种意义上说,第一个“网关”的诞生可以追溯到 1991 至 1992 年之间(LCTT 译注:此处所谓“网关”的意义请参照 CGI 的定义),当时伯纳斯·李和一些计算机科学家与超文本爱好者编写服务程序使得一些特定的资源能够连接到一起,例如 CERN 的内部应用程序、通用的应用程序如 Oracle 数据库、广域信息查询系统(WAIS) 等等。(WAIS 是 Web 的前身,上世纪 80 年代后期开发,其中,开发者之一 Brewster Kahle,是一个数字化图书管理员和 Internet Archive 的创始人。)可以这样理解,“网关”就是一个被设计用来连接其它 Web、数据库或者应用程序的定制的 Web 服务器。任何的动态功能就意味着在不同的端口上运行另外一个守护进程(参考阅读,例如伯纳斯·李对于在网站上如何添加一个搜索功能 的描述)。伯纳斯·李期望 Web 可以成为不同信息系统之间的通用接口,并且鼓励建立单一用途服务。他也提到 Perl 是一种强大的(甚至是不可思议)、可以将各种东西组合起来的语言。

然而,另一种对“网关”的理解指出它不一定是一个定制设备,可能只是一个脚本,一个并不需要额外服务器的低吞吐量的附加脚本。这种形式的首次出现是有争议性的 Jim Davis 的 Gateway to the U Mich Geography server,于 1992 年的 11 月发布在了 WWW-talk 邮件列表中。Davis 的脚本是使用 Perl 编写的,是一种 Web API 的原型,基于格式化的用户查询从另外的服务器拉取数据。我们来说明一下这两种对于网关的理解的不同之处,伯纳斯·李回复了 Davis 的邮件,期望他和 Michigan 服务器的作者“能够达成某种共识”,“从网络的角度来看的话”仅使用一台服务器来提供这样的信息可能会更有意义。伯纳斯·李,可能是期待着 Web 的发明者可以提出一种有秩序的信息资源访问方式。这样从不同服务器上拉取数据的网关和脚本意味着一种潜在的 Web 的质的变化,虽然不断增多,但也可能有点偏离了伯纳斯·李的原始观点。

回到 Perl HTTPD

在 Davis 的地理服务器上的网关向标准化的、低吞吐量的、通过 CGI 方式实现的脚本化网关迈进的一步中,Perl HTTPD 的出现是很重要的事件,它是 1993 年初由印地安纳大学的研究生 Marc Van Heyningen 在 布卢明顿 Bloomington 完全使用 Perl 语言实现的一个 Web 服务器程序。从 Van Heyningen 给出的设计原则来看,基于使用 Perl 就不需要任何的编译过程这样一种事实,使得它能够成为一种极易扩展的服务器程序,这个服务器包含了“一个向代码中增加新特性时只要简单的重启一下就可以,而不会有任何的宕机时间的特性”,使得这个服务器程序可以频繁的加入新功能。

Perl HTTPD 代表了那种服务器程序应该是单一、特定目的的观点。相应的,这种模式似乎暗示了在 Web 开发中像这样渐进式的、持续测试的软件产品可能会最终变成一种共识。Van Heyningen 在后来提到过他从头编写这样一个服务器程序的初衷是当时没有一种简便的方式使用 CERN 服务器程序来生成“虚拟文档”(例如,动态生成的页面),他打趣说使用 Perl 这样的“神之语言”来写可能是最简单的方式了。在他初期编写的众多脚本中有一个 Sun 操作系统的用户手册的 Web 界面,以及 Finger 网关(这是一种早期用来共享计算机系统信息或者是用户信息的协议)。

虽然 Van Heyningen 将印地安纳大学的服务器主要用来连接现存的信息资源,他和研究生们同时也看见了作为个人发布形式的潜在可能。其中一件广为人知事件是在 1993-1994 年之间围绕着一个著名的加拿大案件而公布的一系列的文件、照片和新闻故事,与此形成鲜明对比的是,所有的全国性媒体都保持了沉默。

Perl HTTPD 没有坚持到现在的需要。今天,Van Heyningen 回忆起这个程序的时候认为这个程序只是当时的一个原型产品。它的原始目的只是向那些已经选择了 Gopher 作为大学的网络界面的资深教员们展示了网络的另一种利用方式。Van Heyningen 以一种基于 Web 的、可搜索的出版物索引的方式,用代码回应了他的导师们的虚荣。就是说,在服务器程序技术方面关键创新是为了赢得争论的胜利而诞生的,在这个角度上来看代码做到了所有要求它所做的事。

不管该服务器程序的生命是否短暂,伴随者 Perl HTTPD 一起出现的理念已经传播到了各个角落。Van Heyningen 开始收到了获取该代码的请求,而后将它分享到了网上,并提示说,需要了解一些 Perl 就可以将它移植到其它操作系统(或者找到一个这样的人也行)。不久之后,居住在 奥斯汀 Austin 的程序员 Tony Sanders 开发了一个被称为 Plexus 的轻便版本。Sander 的服务器程序是一款全功能的产品,并且同样包含了 Perl HTTPD 所建议的易扩展性,而且添加一些新的特性如图片解码等。Plexus 直接影响了 Rob McCool 给 NCSA HTTPD 服务器上的脚本开发的“htbin”,并且同样影响到了不久之后诞生的通用网关接口(CGI)。

在这些历史遗产之外,感谢妙不可言的 互联网时光机 Internet Archive 使得 Perl HTTPD 在今天依然保留在一种我们依然可以获取的形式,你可以从这里下载 tarball

历史展望

对于技术世界的颠覆来说,技术的改变总是在一个相互对立的过程中。现有的技术是思考新技术的基础与起点。过时的编程形式启迪了今天人们做事的新方式。网络世界的创新可能看起来更像是对于旧技术的扩展,不仅仅是 Perl。

在萌芽事件的简单的时间轴之外,Web 历史学者也许可以从 Perl 获取更多的线索。其中一部份的挑战在于材料的获取。更多需要做的事情包括从可获取的大量杂乱的数据中梳理出它的结构,将分散在邮件列表、归档网站,书本和杂志中的信息内容组合在一起。还有一部分的挑战是需要认识到 Web 的历史不仅仅是新技术发布的日子,它同时包括了个人记忆、人类情感与社会进程等,并且这不仅仅是单一的历史线而是有许许多多条相似的历史线组合而成的。就如 Perl 的信条一样“ 殊途同归。 There's More Than One Way To Do It.

(题图来自:pinterest.com


via: https://opensource.com/life/16/11/perl-and-birth-dynamic-web

作者:Michael Stevenson 译者:wcnnbdk1 校对:wxy

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