免费注册 查看新帖 |

Chinaunix

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

perl中正则表达式匹配规则失效的问题,求指导。 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-27 17:08 |只看该作者 |倒序浏览
本帖最后由 plabgh 于 2015-08-27 17:09 编辑

各位好,我想匹配以下内容中的变量名和地址

.sdata section layout
  Starting                 Virtual     File
  address     Size      address   offset
  ---------------------------------
  UNUSED   000002  ........       ........           Gpt_ConfigPtr    main.o
  00000000 000004 40001998 00005658  4 Pll_ConfigPtr         main.o
  00000004 000004 4000199c 0000565c   4 Rti_ConfigPtr         main.o
  00000008 000008 400019a0 00005660  8 SpiBTransmitData         main.o
  00000010 000008 400019a8 00005668  8 SpiCTransmitData         main.o
  00000028 00000a 400019c0 00005680  1 .sdata         MSL_C.PPCEABI.bare.VS.UC.a ansi_fp.o
  00000028 000002 400019c0 00005680  4 @246         MSL_C.PPCEABI.bare.VS.UC.a ansi_fp.o
  0000002c 000002 400019c4 00005684  4 @247         MSL_C.PPCEABI.bare.VS.UC.a ansi_fp.o
  00000030 000002 400019c8 00005688  4 @248         MSL_C.PPCEABI.bare.VS.UC.a ansi_fp.o

我使用的匹配规则是:
   if ($line =~ /^\s+\w+\s+\w+\s+(\w+)\s+\w+\s+\d+\s+(\w+)\s+\w+\.o$/) {
      $address = $1;
      $name = $2;
      $MAPFileHash{$name} = $address;
   }

匹配上了以后,分别将$1(地址)和$2(变量名)之间的关系存入哈希表中,但是目前发现哈希表是空的.
会不会是因为$1是4字节,太大了?
应该不可能啊!
麻烦各位帮我看看我的匹配规则,我个人觉得这是很简单的匹配规则,应该不会出错啊,求解。

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
2 [报告]
发表于 2015-08-27 17:21 |只看该作者
  1. if ($line =~ /^\s+\w+\s+\w+\s+(\w+)\s+\w+\s+\d+\s+(\w+)\s+\w+.*\.o$/) {
  2.       $address = $1;
  3.       $name = $2;
  4.       $MAPFileHash{$name} = $address;
  5.    }
复制代码

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
3 [报告]
发表于 2015-08-27 17:21 |只看该作者
试一试 看行不

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
4 [报告]
发表于 2015-08-27 18:12 |只看该作者
您好!
我刚刚试过了,还是不行,很奇怪!
我后面会用到这个哈希表来做替换的,现在的现象是替换失败,所以我认为是哈希表为空,根本就没匹配上规则。回复 3# tc1989tc


   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
5 [报告]
发表于 2015-08-27 18:23 |只看该作者
本帖最后由 plabgh 于 2015-08-27 18:52 编辑

我使用哈希表实现的功能是,将另一个文件中的字符串"@MemoryAddress@varName@"用哈希表中查到的地址代替。
@MemoryAddress@varName@ ==> $MAPFileHash{$varName}
我的替换命令是:
$Prefix = "@" . "MemoryAddress" . "@";
$Suffix = "@";
FileString =~ s/$Prefix(\S*)$Suffix/("0x".$MAPFileHash {$1} || ($Prefix . $1 . $Suffix))/egs;

现在替换后的结果是:@MemoryAddress@varName@ 替换后变成了 0x,少了真正保存在哈希表中的地址。
回复 4# plabgh


   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
6 [报告]
发表于 2015-08-27 18:52 |只看该作者
我使用哈希表实现的功能是,将另一个文件中的字符串"@MemoryAddress@varName@"用哈希表中查到的地址代替。
@MemoryAddress@varName@ ==> $MAPFileHash{$varName}
我的替换命令是:
$Prefix = "@" . "MemoryAddress" . "@";
$Suffix = "@";
FileString =~ s/$Prefix(\S*)$Suffix/("0x".$MAPFileHash {$1} || ($Prefix . $1 . $Suffix))/egs;

现在替换后的结果是:@MemoryAddress@varName@ 替换后变成了 0x,少了真正保存在哈希表中的地址。
tc1989tc 发表于 2015-08-27 17:21

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
7 [报告]
发表于 2015-08-27 19:24 |只看该作者
谢谢,你的匹配规则是对的,错误出现在最后不应该定位到结尾.
改成:
$line =~ /^\s+\w+\s+\w+\s+(\w+)\s+\w+\s+\d+\s+(\w+)\s+\w+.*\.o/
就好了。
我刚刚看到了,确实,main.o后面还有空格,泥马,坑爹。
谢谢你了。大师。
回复 3# tc1989tc


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2015-08-27 19:30 |只看该作者
本帖最后由 MMMIX 于 2015-08-27 19:31 编辑

回复 1# plabgh


    你这个其实用 split 更简单:

while (<>) {
    next unless m/^\s*[[:xdigit:]]+\s+/;
    my ($addr, $id) = (split)[2,5];
    next unless $id =~ m/^\w+$/;
    $MAPFileHash{$id} = $addr;
}

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2015-08-27 22:38 |只看该作者
回复 1# plabgh

说说(依据什么条件) 你要什么资料?
或许反而会更简单,更容易...
   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-08-30 06:20:00
10 [报告]
发表于 2015-08-28 09:55 |只看该作者
本帖最后由 plabgh 于 2015-08-28 10:04 编辑

高手你好,我想问一下:把匹配规则里面"\w+\.o"改成"\w+.*\.o"的原因是什么?
我不明白为什么在这里需要通过.*捡一次垃圾?我发现"\w+"和"\.o"之间没有任何垃圾可捡。
既然没有垃圾为什么我之前的匹配规则不捡垃圾就匹配不上任何文本内容?
谢谢。
回复 2# tc1989tc


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP