免费注册 查看新帖 |

Chinaunix

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

新手求教:从文件中匹配字符串作为变量名,生成hash,表如何实现? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-23 11:14 |只看该作者 |倒序浏览
实现的功能:
1. 从指定文件target.txt中得到需要的字符串A,B,C,字符串是以"[%A%]"为标记
2. 将A,B,C作为Hash表的key保存,同时赋值相应的Value,不能重复
3. hash的Value是变量名$a, $b, $c

目前只完成第一步,输出内容还是错的,请高手纠错,并能否提示一下第2,3怎么实现?!

#!/usr/bin/perl -w
      use strict;   
      my $file = "target.txt";
     
      if (-e $file) {
              open (FH, $file) or die "Can not open the file!$!\n";
                   while (<FH>) {
                      if (~/\[%(.*?)%\]/g) {
                              print "$1\n";
                              }                    
              }
             close(FH);
            }


target.txt的内容是(第一行是空行):

a[%A%]tyrt,
a[%B%]245
a[%B%]111
31q35345234tergsrfg
<br>
<img src=SW-[%C%].jpeg>
<br>
<br>


输出内容:
Use of uninitialized value in concatenation (.) or string at D:\tmp.pl line 21, <FH> line 1.

A
A
B
B
3
>
C
C

实际上预期的结果应该是:
A
B
C

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2010-12-23 11:19 |只看该作者
本帖最后由 zhlong8 于 2010-12-23 11:20 编辑

RE不是这么用的  if (~/\[%(.*?)%\]/g) {  不需要 ~, =~ 是一个操作符不许拆开

你要求的 hash Value 是什么没搞懂,$hash{$1} = sth 就可以了啊

论坛徽章:
0
3 [报告]
发表于 2010-12-23 11:34 |只看该作者
RE不是这么用的  if (~/\[%(.*?)%\]/g) {  不需要 ~, =~ 是一个操作符不许拆开

你要求的 hash Value 是 ...
zhlong8 发表于 2010-12-23 11:19



    多谢!
将"~"删除后,输出的结果是:
A
B
B
C

现在只要将重复的去掉就行。

另一个问题:"sth"指什么?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2010-12-23 14:07 |只看该作者
回复 3# lillainpcy


    你想它是什么它就是什么,主要我不知道你想这个 key 对应的值是什么啊

论坛徽章:
0
5 [报告]
发表于 2010-12-23 14:16 |只看该作者
回复 4# zhlong8


    从文档中匹配出来的变量A=$a, B=$b, C=$c

%hash = (
                 A=>$a,
                 B=>$b,
                 C=>$c
                )

这是希望得到的结果。


另外,如果原文档中一行中有多个匹配,该如何处理?
如果有重复的变量名,又该如何匹配,避免重复呢?

请指教。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2010-12-23 17:52 |只看该作者
回复 5# lillainpcy


    不明白 $a, $b, $c 从哪里来的啊,一行多个你用 while (//g) 这种,或者 @match = $s =~ //g 再循环 @math 都行。什么叫有重复变量名?hash 的 key 是无法重复的啊

论坛徽章:
0
7 [报告]
发表于 2010-12-24 18:17 |只看该作者
变量名恰巧是要取得数据的小写,可以抓住这个巧合在循环内部一步完成,代码如下:
$ha{$1}=lc($1);

去重了又达到哈希的效果。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
8 [报告]
发表于 2010-12-24 18:51 |只看该作者
如果是小写的同名变量的话用下符号引用也不错

论坛徽章:
0
9 [报告]
发表于 2010-12-25 22:08 |只看该作者
#!/usr/bin/perl
open TMP,"<123" or die "Cannot open 123:#!";
foreach(<TMP>){
    while(/\[%(.*?)%\]/g){$hash{$1} = '$'.lc($1)}
}
foreach (keys %hash){
    print "$_ => $hash{$_}\n"
}
你要的大概就是这样吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP