Perl 5.22 预览
Perl v5.22带来了众多新特性和工作方式,使得其perldelta文件比大多数发布版本都要有趣得多。虽然我通常要等到第一个稳定版本发布后才会在The Effective Perler网站上详细介绍这些特性,但这里先为您预览一些重要新闻。
更安全的ARGV
行输入操作符<>
会检查@ARGV
数组以查找要打开和读取的文件名。它有两个参数的open
相同的元字符问题。文件名中的特殊字符可能会执行shell操作。为了绕过这个意外的特性(我认为如果这是您想要的,可能是有用的),有一个新的行输入操作符<<>>
,它不将任何字符视为特殊字符。
while( <<>> ) { # new, safe line input operator
...;
}
CGI.pm和Module::Build从核心库中移除
Perl维护者一直在从标准库中移除模块。有时这是因为没有人使用(或应该使用)那个模块 anymore,没有人想要维护那个模块,或者最好从CPAN获取它,那里的维护者可以比Perl发布周期更快地更新它。尽管如此,您仍然可以在CPAN上找到这些模块。
CGI.pm模块,仅是Lincoln Stein对Perl社区的一项惊人贡献,属于另一个时代。它比Perl 4的前身cgi.pl领先数光年。它可以做任何事情,包括HTML生成。那时还没有健壮的模板系统,CGI.pm是不错的。但,他们已经把它放下了。
不知何故,Module::Build失去了青睐。在此之前,构建和安装Perl模块依赖于非Perl工具make。这是一个可移植性问题。然而,我们知道他们已经安装了Perl,所以如果有纯Perl工具可以完成相同的事情,我们可以解决可移植性问题。我们还可以做更多复杂的事情。这是未来的浪潮。虽然我已经使用它来分发,但我并没有真正接受Module::Build,但我对它的离去还是有点难过。它有一些技术限制,并且有一段时间没有维护,现在它已经被放弃了。David Golden在Paying respect to Module::Build中解释了更多关于这一点。
这突显了与依赖标准库中模块的模块长期存在的问题,通常这个问题是不为人所知的。多年来,大多数作者都没有费心声明这些依赖关系,因为Perl在那里,它的模块也必须在那里。当这些模块转移到仅CPAN状态时,它们最终会有未声明的依赖关系。这也出现在一些违反Perl许可证的Linux发行版中,它们删除了一些模块或将它们放在不同的包中。无论哪种方式,总是声明你所使用的所有内容的依赖关系,无论其来源如何。
十六进制浮点值
你是否一直觉得受到十进制的限制,但也被限制为非整数?现在,您的问题通过十六进制浮点数得到了解决。
我们已经有指数表示法,使用e
来表示指数,如1.23e4
。但是那个e
是一个十六进制数字,所以我们不能用它来表示指数。相反,我们使用p
和一个2的幂作为指数。
use v5.22;
my $num = 0.deadbeefp2;
变量别名
现在我们可以将非引用变量的引用版本分配给。这会为引用的值创建一个别名。
use v5.22;
use feature qw(refaliasing);
\%other_hash = \%hash;
我认为我们将发现这个功能的许多有趣用途,也许还有一些危险的用途,但文档中的用例看起来很有趣。现在我们可以将 foreach
控制变量赋值给除了标量之外的其他内容。
use v5.22;
use feature qw(refaliasing);
foreach \my %hash ( @array_of_hashes ) { # named hash control variable
foreach my $key ( keys %hash ) { # named hash now!
...;
}
}
我不认为我会使用那个特定的模式,因为我习惯于使用引用,但如果你真的很讨厌解引用箭头,这可能适合你。注意,v5.12 允许我们不需要解引用 %
就可以写 keys $hash_ref
。参见我的 Effective Perl 项目 使用数组引用与数组运算符,但也请参见 不要在 each 或 keys 中使用自动解引用。
列表赋值中的重复
Perl 可以将一个标量列表赋值给另一个。在 Learning Perl 中,我们展示了赋值给 undef
。我可以创建哑变量
my($name, $card_num, $addr, $home, $work, $count) = split /:/;
但如果我不需要所有这些变量,我可以在赋值列表中放置占位符 undef
my(undef, $card_num, undef, undef, undef, $count) = split /:/;
这些连续的 undef
可能会出问题,而且看起来也很丑。现在我无需数出单独的 undef
use v5.22;
my(undef, $card_num, (undef)x3, $count) = split /:/;
Win32 上的列表管道打开
三个参数的 open
可以接受管道模式,这在以前在 Windows 上不起作用。现在它做到了,到足以让 system
的列表形式在 Win32 上工作
open my $fh, '-|', 'some external command' or die;
我总是要检查我的笔记才能记住管道模式中的 -
在有管道的一侧。Unix 世界中的人知道 -
在许多命令中是标准输入的特殊文件名。
各种小修复
我还认为有许多小的修复值得称赞。其中许多是对瑕疵和特殊情况进行的清理
- 现在,
/x
正则表达式操作符标志现在忽略 Unicode 空白字符,而不仅仅是 ASCII 空白字符。如果你尝试在操作符上使用多个/x
,你也不能这样做(以前也不行,但这不是一个错误)。 - 在模式中,现在应将字面量
{
转义。我通常都会这样做。 - 一个错误的
close
现在会设置$!
。我们不必与$?
玩弄以找出发生了什么。 defined(@array)
和defined(%hash)
现在是致命的。这些功能已被弃用很长时间,现在它们已经消失了。但这不适用于赋值,例如defined(@array = ...)
。- 在 Perl 预期引用的地方使用命名数组或散列现在是致命的。
- 在散列和数组名称上省略 % 和 @ 现在是不允许的。不再有
my %hash = (...); my @keys = keys hash
,其中 Perl 将裸词hash
解释为%hash
。这是一个 Perl 4 功能,现在不再存在。
本文最初发布在 PerlTricks.com 上。
标签
brian d foy
brian d foy 是一名 Perl 训练师和作家,同时也是 Perl.com 的资深编辑。他是 Mastering Perl、《Mojolicious Web Clients》、《Learning Perl Exercises》的作者,以及 Programming Perl、《Learning Perl》、《Intermediate Perl》和《Effective Perl Programming》的合著者。
浏览他们的文章
反馈
这篇文章有什么问题吗?请在 GitHub 上打开一个问题或拉取请求来帮助我们。