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

看板Perl作者 (Cindy Wang)時間9年前 (2014/12/03 17:04), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串4/4 (看更多)
我也提供一個~ @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; : } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 112.121.80.249 ※ 文章網址: http://www.ptt.cc/bbs/Perl/M.1417597458.A.D67.html

12/03 19:46, , 1F
對/A/作用的split 用三參數版本的應該是會比較有效率
12/03 19:46, 1F

12/03 20:46, , 2F
推用兩個長一樣的map抓到問題的規律
12/03 20:46, 2F

12/03 21:01, , 3F
嗯, 用三個參數應該是會比較有效率.. 只是有時候在執行
12/03 21:01, 3F

12/03 21:02, , 4F
效率與寫作效率之間, 還真難取捨... ._.
12/03 21:02, 4F
文章代碼(AID): #1KVj8Ird (Perl)
文章代碼(AID): #1KVj8Ird (Perl)