免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2786 | 回复: 2
打印 上一主题 下一主题

哪位给俺帮个忙,为啥解析后从数组中取值结果都是18446744073709551615呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-05 17:57 |只看该作者 |倒序浏览
本帖最后由 purejava 于 2010-08-05 18:00 编辑

刚接触perl一周,用来分析性能测试过程中的文本文件-其实就是vmstat打出的日志,想统计在所有行中第几个字段的平均值。
可是问题总是出现在使用变量获取第n个字段值的时候,取出来总是18446744073709551615这个最大值,这是为什么呢?
解析的数据类似这样:
  1. [2010-08-05 15:44:10] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
  2. [2010-08-05 15:44:10]  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
  3. [2010-08-05 15:44:10]  1  0 144336 28822840 400604 2927656    0    0     0    11    0    0 27  2 71  0  0[code]
复制代码
我的脚本:parsevm

  1. #!/usr/bin/perl

  2. use strict;
  3. #第一个参数为要分析的文件,后面的参数为要统计行中第几个字段
  4. my $filename = shift @ARGV;
  5. unless (open TARFILE, $filename) {
  6.   die "can not open file: $filename";
  7. }

  8. my @indexs = @ARGV;
  9. print "You want to parse (@indexs) of fields in file: $filename\n";

  10. # %count记录某字段的总和
  11. #%items记录某字段的个数
  12. my ($target, $line, @fields, %count, %items);

  13. #依次读取每一行,并根据传入的字段索引使用两个hashtable进行总数和个数的统计,hashtable的key就是字段所引
  14. while (chomp($line = <TARFILE>)) {
  15.   @fields = split (/\s+/, $line);

  16.   foreach $target (@indexs) {
  17.     if ( ($fields[$target] = ~ /^\d+$/)) {
  18.   #print "$target , $fields[$target], $fields[13]\n";
  19.   #问题就处在这一行,取$fields[$target]时取出的总是一个最大值18446744073709551615
  20.       $count{$target} += $fields[$target];

  21.     print "current value is : $fields[$target]\n";
  22.       $items{$target} += 1;
  23.       print "count: $count{$target}, length: $items{$target}\n";
  24.     }
  25.   }
  26. }

  27. print "Now analysis over.\n";

  28. #开始计算每个字段的平均值
  29. foreach $target (@indexs) {
  30.   my $avg = $count{$target}/$items{$target};
  31.   print "index [$target]: all: $count{$target}, count: $items{$target}, avg: $avg\n";
  32. }
复制代码
调用方法: 分析第13、15个字段的平均值:
# perl  parsevm vmstat.log 13 15

样本数据:vmstat.log[code][2010-08-05 15:44:10] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
[2010-08-05 15:44:10]  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
[2010-08-05 15:44:10]  1  0 144336 28822840 400604 2927656    0    0     0    11    0    0 27  2 71  0  0
[2010-08-05 15:44:13]  0  0 144336 28822888 400604 2927664    0    0     0   601 1031  605  1  0 99  0  0
[2010-08-05 15:44:16]  0  0 144336 28800692 400604 2927668    0    0     0     0 3529 3365  1  0 99  0  0
[2010-08-05 15:44:19]  0  0 144336 28800692 400604 2927668    0    0     0   401 1047  473  0  0 100  0  0
[2010-08-05 15:44:22]  0  0 144336 28800692 400604 2927668    0    0     0    11 1027  487  0  0 100  0  0
[2010-08-05 15:44:22] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
[2010-08-05 15:44:22]  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
[2010-08-05 15:44:22]  1  0 144336 28800428 400604 2927668    0    0     0    11    0    0 27  2 71  0  0
[2010-08-05 15:44:25]  0  0 144336 28800824 400604 2927668    0    0     0     0 1028  571  1  0 99  0  0
[2010-08-05 15:44:28]  0  0 144336 28800824 400604 2927668    0    0     0    48 1031  498  0  0 100  0  0
[2010-08-05 15:44:31]  1  0 144336 28209552 400608 2927668    0    0     0    91 1026  588  0  1 98  0  0
[2010-08-05 15:44:34]  1  0 144336 26553620 400628 2927684    0    0     0   405 1185 1151  3  4 91  2  0
[2010-08-05 15:44:34] procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
[2010-08-05 15:44:34]  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
[2010-08-05 15:44:34]  2  0 144336 26553604 400628 2927684    0    0     0    11    0    0 27  2 71  0  0
[2010-08-05 15:44:37]  0  0 144336 26542504 400636 2927712    0    0     0     0 1385 1535  2  0 98  0  0
[2010-08-05 15:44:40]  0  0 144336 26542132 400636 2927712    0    0     0   101 1030  841  0  0 100  0  0
[2010-08-05 15:44:43]  0  0 144336 26542256 400636 2927712    0    0     0     0 1028  837  0  0 100  0  0
[2010-08-05 15:44:46]  1  0 144336 26517992 400636 2927720    0    0     0   104 1110 1294  2  0 98  0  0[code]

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
2 [报告]
发表于 2010-08-05 18:26 |只看该作者
回复 1# purejava


     if ( ($fields[$target] = ~ /^\d+$/))

=~应该连在一块,不能分开,否则就是~操作符了

论坛徽章:
0
3 [报告]
发表于 2010-08-06 11:02 |只看该作者
回复  purejava


     if ( ($fields[$target] = ~ /^\d+$/))

=~应该连在一块,不能分开,否则就是 ...
yybmsrs 发表于 2010-08-05 18:26



    非常的感谢你啊,粗心害死人啊...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP