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