Re: [請益] 在一行code中split兩次

作者: CindyLinz (Cindy Wang)   2014-12-03 17:04:16
我也提供一個~
@result =
map { (split /B/)[0] } map { (split /A/)[0,2,4] } @data;
就...
[xxxxxx]->[0] 可以寫成 (xxxxxx)[0]
@{[xxxxxx]}[0,2,4] 可以寫成 (xxxxxx)[0,2,4]
然後把 for 換成 map 讓它湊成(?)一個 expr
※ 引述《Neisseria (Neisseria)》之銘言:
: 應該就是原文 A 大寫的方法,這裡重寫一次
: # 假設 gen_data() 產生出符合本文條件的 data,最下面有 gen_data 的例子
: my @data = map { gen_data() } (1..100);
: for my $i (0..$#data) {
: my @e = map { [split /B/]->[0] } @{[split /A/, $data[$i]]}[0,2,4];
: print "@e\n";
: }
: 這樣子算比較 compact,好不好看個人
: 如果只是用一次就丟的 script,算蠻方便的寫法
: ※ 引述《josefy (醉落~最弱)》之銘言:
: : 各位版大好, 程式碼如以下
: : 假設@data已經從外部讀入 且共有 n 筆
: : for($i=0;$i<$n;$i++){
: : @temp1=(split(/A/,@data[$i]))[1,3,5];
: : # 第一次split用A來做條件, 取第1,3,5個元素
: 如果要取第 1, 3, 5 個元素,應該是取 0, 2, 4
: 因為 index 是從 0 開始算
: : for($j=0;$j<3;$j++){ # 用迴圈再逐個元素split一次
: : @temp2=(split(/B/,@temp1[$j])[1]; # 取第一個元素
: : }
: 這裡可能會有問題,因為 array 要增加 scalar 不是用 assignment
: 是用 push 或是 unshift
: 或者是用 Perl 的特性,調整 index,讓 Perl 把 array 自動增長
: 所以可能可以重寫成
: my @temp2;
: for my $j (0..2) {
: push @temp2, (split /B/, @temp1[$j])[0];
: }
: : }
: 最後附上 gen_data 的例子,僅供參考
: sub gen_data {
: my $data = "";
: for my $i (1..5) {
: for my $j (1..3) {
: $data .= int(rand(10)); # our "data"
: if ($j < 3) {
: $data .= 'B'; # separator B
: }
: }
: if ($i < 5) {
: $data .= "A"; # separator A
: }
: }
: return $data;
: }
作者: flu (Crazy Rhythm)   2014-12-03 19:46:00
對/A/作用的split 用三參數版本的應該是會比較有效率
作者: AntaresStar   2014-12-03 20:46:00
推用兩個長一樣的map抓到問題的規律
作者: CindyLinz (Cindy Wang)   2014-12-03 21:01:00
嗯, 用三個參數應該是會比較有效率.. 只是有時候在執行效率與寫作效率之間, 還真難取捨... ._.

Links booklink

Contact Us: admin [ a t ] ucptt.com