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/m.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燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP