Re: [請益] 在一行code中split兩次
應該就是原文 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), 來自: 203.71.94.31
※ 文章網址: http://www.ptt.cc/bbs/Perl/M.1417578490.A.8C8.html
→
12/03 13:28, , 1F
12/03 13:28, 1F
→
12/03 13:56, , 2F
12/03 13:56, 2F
※ 編輯: Neisseria (60.251.46.166), 12/24/2018 16:20:09
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 3 之 4 篇):
Perl 近期熱門文章
PTT數位生活區 即時熱門文章