Perl 板


LINE

Perl 现在可以对复杂结构作 destructuring assignment 了 ^^ 我最近写了一个叫作 DestructAssign 的 mod 丢到 cpan 上面, 用法大概是这样: use DestructAssign qw(des des_alias); 在函数 des 後面放一个 [...] 或 {...} (anonymous array 或是 anonymous hash), 里面可以放一些准备接资料的变数, 这样就做成一个可以 match 资料结构的 pattern. 然後就可以拿 = 指定一个形状类似的资料给它, 那麽放在 pattern 里面的变数们就会接到资料了. 实际例子像这样: my($w, $x, $y, $z); des [$x, [undef, {y => $y}, undef, $w], $z] = [2, [25, {x => 'x', y => 3}, 26, 1], 4]; # got ($w, $x, $y, $z) = (1, 2, 3, 4) # 资料结构可以是递回巢状的 # array pattern 可以放 undef 来跳过你不想拿的栏位 # hash pattern 里面 # 是 value 的部分可以放接资料的变数 # key 的部分是用来指定要拿 data 对应的 hash 中 # 哪一个 key 的 value des [3 => $w, $x, -2 => $y, $z] = [1..9]; # got ($w, $x, $y, $z) = (4, 5, 8, 9) # 在 array pattern 里面也可以直接指定要拿的 index # 也依 perl 习惯, 负的 index 表示从尾巴拿 my(@array, %hash); des [3 => @array, -4 => %hash] = [1..8]; # got @array = (4..8), %hash = (5 => 6, 7 => 8) # 在 array pattern 里面放 @array 或 %hash 变数的话 # 它会取得从那时的位置开始之後的所有资料 # 比起传统的 my($a, $b, @remain) = (1,2,3,4,5); # 3,4,5 给了 @remain 之後如果还想再用别的变数拿其中的东西, # 可以再用指定 index 的方式重拿 :p des {x => $x, x => [$y, $z]} = {x => [1, 2]}; # got $x = [1,2], $y = 1, $z = 2 # 如果某个资料栏位是一个复杂的结构, # 你又想用一个变数拿它整个, 又想拿别的变数拿它其中一部分, # 可以重复指定同样的 key 多拿几次. # 就算是 hash pattern 也可以用重复的 key my $data = [1, 2, 3]; des_alias [undef, $x] = $data; $x = 20; # got $data = [1, 20, 3] # des_alias 和 des 的差别是, des 是把 data 的值 copy 给变数 # 而 des_alias 是把变数变成 data 的 alias # 从此对接收变数的读写动作都会直接反应在 data 上 # 由於「黏上」的变数不太方便断开魂结 # 所以建议直接 my 新的变数来黏, 或是对 package var 的话用 local 的 # 出了 block 以後就可以自动尘归尘土归土 { des [my($i, $j), { k => my $k }] = [1, 2, {k => 3}]; # got my($i, $j, $k) = (1, 2, 3) # 这个是一边作 destruct assign 一边 my 接收变数的示范用法 } my $oo; my $data = [1,2,3]; { des_aliasmy [$oo] = $data; $oo = 5; # got $data = [5,2,3]; } # got $oo = undef; # 外面的 $oo 没有黏到 $data $oo = 6; # got $data [5,2,3]; # 存取外面的 $oo 不会影响 $data 的内容 详细的说明可以看 cpan 或 metacpan 或 github, 如果有遇到 bug, 或是有觉得哪种长相的 pattern 应该也很实用但我没做, 都欢迎跟我讨论 ^^ 在 ptt 这边或是 github 上面, 或是 perl RT 都可以~ 目前我测试过能用的 perl 版本有: 5.8.9, 5.10.1, 5.12.5, 5.14.4, 5.16.3, 5.18.2, 5.20.0 5.8.5 还不能用 接下来我想做的有 让它在 5.8.5 可以用, 加上「取 reference」(就是 \ ) 的 pattern, 把指定 index 和 key 的 constant 在 compile time 预作处理, 因为就算是 constant, perl 的 scalar overhead 还是蛮多的, 有一块效能可以偷, 还有 hash key 的 hash 值也可以预先计算. cpan: http://search.cpan.org/~cindy/DestructAssign/lib/DestructAssign.pm metacpan: https://metacpan.org/pod/DestructAssign github: https://github.com/CindyLinz/Perl-DestructAssign --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 112.121.80.249
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Perl/M.1407921627.A.B3E.html
1F:推 abliou: 推阿 08/14 00:15
2F:→ xatier: why support 5.8.5 www 08/14 12:34
3F:→ CindyLinz: 好问题.. 囧 08/14 12:49
4F:→ xatier: 该不会是你们家... XD 08/14 14:52
5F:→ CindyLinz: 应该没有..XD 是 cpan tester 有列到的关系 ^^| 08/14 15:25
6F:推 skenbo0916: 推! 08/14 17:59
7F:→ xatier: 喔喔 XDDDDDD 08/15 12:23
8F:推 herculus6502: 本人不错看 08/15 16:14







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP