免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 44609 | 回复: 11

哈希问题求助 [复制链接]

论坛徽章:
1
处女座
日期:2014-12-12 10:55:00
发表于 2016-08-02 15:52 |显示全部楼层
这是我自己写的代码,预想中的结果是这样的:
Cate
Adam
但是实际结果是这个样子的:
Cate
Cate
Cate
Cate
Adam
Adam
Adam
Adam

代码如下
  1 #!/usr/bin/perl -w
  2
  3 use strict;
  4
  5 my %a = (
  6     'a' => '1',
  7     'b' => '2',
  8     'c' => '3',
  9     'd' => '4'
10     );
11
12 my %b = (
13     'a' => 'Adam',
14     'c' => 'Cate',
15     'e' => 'Eva',
16     'l' => 'Lily'
17     );
18
19 foreach my $a (keys %a) {
20     foreach my $b (keys %b) {
21         if (exists $b{$a}) {
22             print $b{$a}, "\n";
23         }
24     }
25 }

求懂得人帮我分析下,谢谢

论坛徽章:
0
发表于 2016-08-02 18:26 |显示全部楼层
你可以试试把 $b在if代码块中打印一下,应该跟你想的不太一样

论坛徽章:
307
程序设计版块每周发帖之星
日期: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
发表于 2016-08-02 19:08 |显示全部楼层
这样试下,

  1. 19 foreach my $a (keys %a) {
  2. 20
  3. 21         if (exists $b{$a}) {
  4. 22             print $b{$a}, "\n";
  5. 23         }
  6. 24
  7. 25 }
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2016-08-02 19:59 |显示全部楼层
你多嵌套了一层循环:
  1. 1 #!/usr/bin/perl -w
  2.   2
  3.   3 use strict;
  4.   4
  5.   5 my %a = (
  6.   6     'a' => '1',
  7.   7     'b' => '2',
  8.   8     'c' => '3',
  9.   9     'd' => '4'
  10. 10     );

  11. 12 my %b = (
  12. 13     'a' => 'Adam',
  13. 14     'c' => 'Cate',
  14. 15     'e' => 'Eva',
  15. 16     'l' => 'Lily'
  16. 17     );

  17. foreach my $a (keys %a) {
  18.      # foreach my $b (keys %b) {
  19.          if (exists $b{$a}) {
  20.              print $b{$a}, "\n";
  21.          }
  22.      #}
  23. }
复制代码
注释的两行是问题的根本,就好像你检查 %a 中的 key, 是否在 %b 中存在,但检查了 b 的 keyy 的数量的次数。

论坛徽章:
1
处女座
日期:2014-12-12 10:55:00
发表于 2016-08-03 10:39 |显示全部楼层
我是想取出这两个哈希之间共同的keys,所以用了两层循环,但是得出的结果不正确,如果想要得出这两组哈希之间共同的keys那我该怎么做呀,谢谢回复 4# 104359176


   

论坛徽章:
1
处女座
日期:2014-12-12 10:55:00
发表于 2016-08-03 10:41 |显示全部楼层
我是想取出这两个哈希中工头的keys 如果只用一层循环的话 这样可以筛选出结果么=。=, 谢谢回复 3# sunzhiguolu


   

论坛徽章:
1
处女座
日期:2014-12-12 10:55:00
发表于 2016-08-03 10:41 |显示全部楼层
好, 我试试回复 2# 白菜饺子馅


   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
发表于 2016-08-03 11:06 |显示全部楼层
回复 5# jiangphoenix


    取出共同的 key, 一层循环就好了。

如果用 newLISP 就更加简单了:
  1. (intersect '(3 0 1 3 2 3 4 2 1) '(1 4 2 5))  
  2. → (2 4 1)
复制代码
这是取出两个列表**同的值,如果是两个散列,可以先取出 key
  1. (map first @hash-one)
复制代码

论坛徽章:
1
处女座
日期:2014-12-12 10:55:00
发表于 2016-08-03 13:35 |显示全部楼层
奥奥奥,非常感谢!回复 8# 104359176


   

论坛徽章:
307
程序设计版块每周发帖之星
日期: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
发表于 2016-08-03 13:45 |显示全部楼层
回复 6# jiangphoenix
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my %a = (
  4.     'a' => '1',
  5.     'b' => '2',
  6.     'c' => '3',
  7.     'd' => '4'
  8.     );

  9. my %b = (
  10.     'a' => 'Adam',
  11.     'c' => 'Cate',
  12.     'e' => 'Eva',
  13.     'l' => 'Lily'
  14.     );

  15. foreach my $a (keys %a) {
  16.     if (exists $b{$a}){
  17.         print "$a\n";
  18.     }
  19. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP