※ 引述《asiagodfater (亚洲统粉前来报到)》之铭言:
: 无奈于小弟是程设新手,最菜的那种
: 目前想要把同天同小时的资料做平均然后输出
: 目前写成这样
: 不知道错在哪里
: http://pastebin.com/Fnxs2Jdk
: 不知道有没有大哥大姐可以给点指导,程式码内注解掉的部分为原始资料的一小部分
: 求解求帮助
你每一次 <$fh> 的动作会从档案中读进来新的一行,
你原本的写法可能会每区漏掉一行..
goto 在没特别好处的时候少用比较好~
然后, use strict 与 use warnings 开起来通常会是好习惯~
最后面是我试作的程式:
用 <DATA> 可以把 __DATA__ 后面的东西当成档案读进来,
regex 可以只 capture 你要的部分, 这样就比较不需要去数 capture 的编号了.
然后, regex 里面的 . 是特殊字符, 加一下反斜线比较好.
我在日期与小时的部分是把年月日时四个字段一起抓进来,
所以要用 eq 这种字串比对.
while( <ooxx> ) 这样写法, 在 while 里面没指定读进来的东西要放哪, 会读一行进 $_
if( /ooxxooxx/ ) 这样写法, 没有指定 regex 要跟谁比对, 会跟 $_ 比对
不过如果程式复杂的话, 这种写法会让 $_ 重复地被盖来盖去就是不好的习惯了~
print 要印的东西如果想要包含一点点计算, 像是我需要一个除法来作平均,
可以让 print 印好几项, 将这个计算的 expression 独立放置, 不要塞在字串里面~
最后, 我不是大姐, 不准叫我大姐~ v_v
#!/usr/bin/perl
use strict;
use warnings;
my($key, $sum, $count) = ('', 0, 0);
while( <DATA> ) {
if( /(\d+-\d+-\d+-\d+):\d+:\d+ (\d+\.\d+)/ ) {
if( $1 eq $key ) {
$sum += $2;
++$count;
}
else {
if( $count ) {
print "$key ", $sum/$count, "\n";
}
$key = $1;
$sum = $2;
$count = 1;
}
}
}
if( $count ) {
print "$key ", $sum/$count, "\n";
}
__DATA__
2017-3-7-0:16:20 3.030
2017-3-7-0:18:21 2.857
2017-3-7-0:20:20 2.870
2017-3-7-0:22:20 2.991
2017-3-7-0:24:20 3.118
2017-3-7-1:45:20 3.152
2017-3-7-1:31:20 3.421
2017-3-8-1:45:20 2.665
2017-3-8-1:31:20 5.765