应该就是原文 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;
}