- 论坛徽章:
- 1
|
"Perl 5 to 6" Lesson 27 - 常用的 Perl 6 数据处理的习惯用法
概要- # 从键和值的列表创建哈希
- # 方案 1: slices 切片
- my %hash;
- %hash{@keys} = @values;
- # 方案 2: meta operators 元操作
- my %hash = @keys Z=> @values;
- # 从数组创建哈希, 给每个数组元素 true 值:
- my %exists = @keys Z=> 1 xx *;
- # 限制值的范围, 这是 0 .. 10.
- my $x = -2; say 0 max $x min 10;
- # dubugging: 给容器中的值 dump 出来, 包含名字, 输出到标准错误
- note :$x.perl;
- # 不区分大小写排序
- say @list.sort: *.lc;
- # 强制属性
- class Something {
- has $.required = die "Attribute 'required' is mandatory";
- }
- Something.new(required => 2); # no error
- Something.new() # BOOM
复制代码 描述
学习一门语言只靠规范是不够的, 它必须在生产中使用. 相反, 你们需要知道如何解决具体问题. 常用的处理模式叫 idioms 惯用用法, 可以帮助我们在每次有问题的时候不用重新发明轮子.
所以这是一些常用的 Perl 6 的习惯用法来操作数据结构.
哈希- # 从键和值的列表创建哈希
- # 方案 1: slices 切片
- my %hash;
- %hash{@keys} = @values;
- # 方案 2: meta operators 元操作
- my %hash = @keys Z=> @values;
复制代码 这个第一个方案和你的 Perl 5 是基本相同的: 使用切片来分配. 第二个方案是使用的 zip 操作符的 Z 操作, 这会 zip 成一个列表象: 1, 2, 3 Z 10, 20, 30 变成 1, 10, 2, 20, 3, 30. 这的 Z=> 是元操作, 在这通过 => ( Pair 创建的操作 ) 来绑定 zip . 所以 1, 2, 3 Z=> 10, 20, 30 相当于 1, 2, 3 Z=> 10, 20, 30. 赋值给哈希一个数组列表变量.
对于存在检查, 这个哈希的值是不什么重要, 主要他们在布尔上下文返回 True. 在这种情况下, 有一个不错的方式来初始化哈希, 给 keys 一个数组或者列表- my %exists = @keys Z=> 1 xx *;
复制代码 这是一个 lazy, 在右侧 1 组成无穷列表, 并依赖 Z 来结束这个列表.
[Numbers]
有时你从一些其它的地方取得一个数字, 但这个数字有一个自己预先定义的范围 ( 例如, 这样它可以作为一个数组索引 ).
在 Perl 5 中, 你常常会遇到什么 $a = $b > $upper ? $upper : $b, 其它的限制是 lower. 在这个地方我们使用 max 和 min 的中缀运算符, 可以简化成- my $in-range = $lower max $x min $upper;
复制代码 因为 $lower max $x 返回两个数中较大的, 因此切出了这个范围的下端.
这为 min 和 max 是中缀运算符, 你也可以这样使用:[Debugging]
Perl 5 中我们常常使用 Data::Dumper, 在 Perl 6 的中我们使用对象的 .perl 方法. 这二个都能尽可能生成, 真实的原始数据结构.
这个 :$var 生成 => 的键值对 ("colonpair"), 使用变量名做为关键字 ( 但前标记会剥离开 ). 因些, 它们会是 var => $var 一样的结构. note() 是用于写入标准错误, 并追加一个换行. 所以 `:$var.perl 是一个获得用于调试, 名称, 目标的变量的值的快捷方式.
[Sorting]
象 Perl 5 中一样, 这个 sort 是内置的. 它可根据所采取的比较函数来比较两个值, 然后排序. 不同于 Perl 5 的是, 这更加智能, 如果你的参数只有一个值会自动使用 transformation.
如果你想过一个 transformed 对值进行比较, 在 Perl 5 中你可以这样:- # WARNING: Perl 5 code ahead
- my @sorted = sort { transform($a) cmp transform($b) } @values;
- # or the so-called Schwartzian Transform:
- my @sorted = map { $_->[1] }
- sort { $a->[0] cmp $b->[0] }
- map { [transform($_), $_] }
- @values
复制代码 上面二个的解决方案的在进行比较的时候, 第一个需要不断重复转换的输入. 第二个方案通过存储原始值转化后的值避免了重复输入, 但它多写了相当多的代码.
Perl 6 会自动使用第二种方案 ( 使用更加有效的 Schwartzian 转换, 避免数组的每个值重复转换 ), 这个转换函数只有一个参数:- my @sorted = sort &transform, @values;
复制代码 强制属性
通常我们强制一些属性必须存在, 是为了检查其构造函数中是否存在.
在 Perl 6 中也是这样工作的, 但它更加容易, 更加安全, 当请求每个需要存在属性时:- has $.attr = die "'attr' is mandatory";
复制代码 这利用了默认值的机制. 当提供一个值, 这个就永远不会执行, 会用于生成默认值, 这个 die 不会触发. 如果有任何构造函数没设置这个值, 就会抛出异常.
动机
N/A |
|