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

作者: Neisseria (Neisseria)   2014-12-03 11:48:06
應該就是原文 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;
}
作者: AntaresStar   2014-12-03 13:28:00
我發覺我把很簡單的()寫成@{[]}了...XD
作者: Neisseria (Neisseria)   2014-12-03 13:56:00
好像的確只要用()就可以了,看了覺得很順就 po 上來 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com