忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 425 | 回复: 5

求助:Use of uninitialized value问题 [复制链接]

论坛徽章:
0
发表于 2017-07-10 09:33 |显示全部楼层
本帖最后由 skyheight 于 2017-07-10 09:34 编辑

先说一下脚本的用途。
①通过字符串匹配找到红框所示的字符串所在的行数。
②得到篮框所示的数组。
③得到数组第一列的数据,为最终数据。并进行后续的数据判断等。。。
尝试写了一个脚本,但是在第②步的时候,出现报错信息:“Use of uninitialized value $array[0] in join or string at C:\Users\61068\Desktop\test\ring_test.pl line 33, <FH> line 7684.”
请问应该如何解决?
另外第②步得到的两列数据,如何处理得到第一列的数据呢?
无标题.png

  1. #!/usr/bin/perl
  2. use warnings;
  3. use File::Spec::Functions;
  4. use File::Copy;

  5. $searchdir="C:/Users/61068/Desktop/test"; #指定源文件夹路径
  6. $str1=" Average Ring size"; #指定欲匹配的字符串1
  7. $str2=" Ring size   Number"; #指定欲匹配的字符串2
  8. opendir(DIRHANDLE,$searchdir) || die "Cann't open $searchdir !";
  9. while($file=readdir DIRHANDLE) {
  10.         if (-d "$searchdir/$file") { #寻找字符串对应的行数
  11.                 print "$searchdir/$file is a directory!\n";
  12.         } else {
  13.                 open(FH, "$searchdir/$file") || die "cann't open $searchdir/$file !\n";
  14.                 $lines1=0;
  15.                 $lines2=0;
  16.                 my @data_raw=\*FH;
  17.                 while ($LINE=<FH>) {
  18.                         $back1=rindex($LINE,$str1);
  19.                         $back2=rindex($LINE,$str2);
  20.                         if ( $back1 != -1 ) {
  21.                                 $lineB=$lines1-3;
  22.                         }
  23.                         if ($back2 != -1){
  24.                                 $lineA=$lines2+1;
  25.                         }
  26.                        $lines1+=1;
  27.                        $lines2+=1;
  28.                                                 }
  29.                                                 print "Ring size data of $file lies between line$lineA and line$lineB.\n"; #输出数据所在的行数
  30.                                                 my @array=@data_raw[$lineA..$lineB]; #获得数据
  31.                                                 print "@array\n";
  32.                                         }
  33.                                 }
  34.                                 close(FH);
  35. closedir(DIRHANDLE);
复制代码


论坛徽章:
302
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-10 10:56 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-07-11 00:05 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $flag = 0;
  5. my @aData = ();
  6. while(<DATA>){
  7.         next if(/\A\s*\z/);
  8.         if(/\A\s*Ring\s+size\s+Number/){
  9.                 $flag++;
  10.                 next;
  11.         }
  12.         next if($flag < 1);
  13.         if(/\A\s*Average\s+Ring\s+size:/){
  14.                 print("@aData\n");
  15.                 $flag = @aData = ();
  16.                 next;
  17.         }
  18.         push(@aData, (split)[0]);
  19. }

  20. __DATA__
  21.         41        014        6        2
  22.         41        014        7        2
  23.         
  24.         42        015        4        1
  25.         42        015        16        1
  26.         
  27.         Overall Ring        count:
  28.         Ring size Number
  29.                 3        2
  30.                 4        3
  31.                 5        2
  32.                 6        10
  33.                 7        4
  34.                 16        1
  35.                
  36.         Average Ring size:        6.00
  37.         
  38.                 Other lines
复制代码

论坛徽章:
0
发表于 2017-07-10 23:06 |显示全部楼层
回复 2# sunzhiguolu

大神好!学习了,有些地方没弄明白,请问您脚本中  next if(!$flag); 什么意思呢?判断flag的值为0吗?另外可否简单指导一下 flag 的逻辑?谢谢大神!

论坛徽章:
302
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-07-10 23:57 |显示全部楼层
回复 3# zero_BX
将代码的 14~19 行注释起来,加入一行 print 观察下输出结果。

论坛徽章:
0
发表于 2017-07-11 10:45 |显示全部楼层
回复 2# sunzhiguolu

太感谢啦,这个问题困扰我好几天了,大神分分钟搞定,服!

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-07-11 13:06 来自手机 |显示全部楼层
服         
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP