免费注册 查看新帖 |

Chinaunix

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

请教:map函数的使用出错! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-10 22:11 |只看该作者 |倒序浏览
本帖最后由 华小飞_Perl 于 2016-09-10 22:21 编辑

只是一个练习,出现错误,请教各位了,源代码如下:
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;
  4. use Data::Dumper;

  5. my @gilligan = qw( red_shirt hat luckey_socks water_bottle );
  6. my @skipper = qw( blue_shirt hat jacket preserver sunscreen );
  7. my @professor = qw( sunscreen water_bottle slide_rule batteries radio );

  8. my %all = (
  9.         Gilligan  => \@gilligan,
  10.         Skipper   => \@skipper,
  11.         Professor => \@professor,
  12. );

  13. my %ch_all = map {
  14.         my $person = $_;
  15.         map { $person => { $_ => 1 } } @{ $all{$person} };
  16. } sort keys %all;

  17. print Data::Dumper->Dump( [ \%ch_all ], [ qw(*ch_all) ] );
复制代码

原来想构建的哈希数据结构如下:
  1. %ch_all = (
  2.             'Gilligan' => {
  3.                             'luckey_socks' => 1,
  4.                             'water_bottle' => 1,
  5.                             'hat' => 1,
  6.                             'red_shirt' => 1
  7.                           },
  8.             'Professor' => {
  9.                              'slide_rule' => 1,
  10.                              'water_bottle' => 1,
  11.                              'batteries' => 1,
  12.                              'sunscreen' => 1,
  13.                              'radio' => 1
  14.                            },
  15.             'Skipper' => {
  16.                            'jacket' => 1,
  17.                            'sunscreen' => 1,
  18.                            'preserver' => 1,
  19.                            'blue_shirt' => 1,
  20.                            'hat' => 1
  21.                          }
  22.           );
复制代码

但实际运行下来如下:
  1. %ch_all = (
  2.             'Gilligan' => {
  3.                             'water_bottle' => 1
  4.                           },
  5.             'Professor' => {
  6.                              'radio' => 1
  7.                            },
  8.             'Skipper' => {
  9.                            'sunscreen' => 1
  10.                          }
  11.           );
复制代码

请问各位在map函数使用上存在哪些错误,请指正,谢谢!
(啰嗦了点,勿喷~)

论坛徽章:
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
2 [报告]
发表于 2016-09-10 23:02 |只看该作者
分开写就行了.
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;
  4. use Data::Dumper;

  5. my @gilligan = qw( red_shirt hat luckey_socks water_bottle );
  6. my @skipper = qw( blue_shirt hat jacket preserver sunscreen );
  7. my @professor = qw( sunscreen water_bottle slide_rule batteries radio );

  8. my %all = (
  9.         Gilligan  => \@gilligan,
  10.         Skipper   => \@skipper,
  11.         Professor => \@professor,
  12. );

  13. my %ch_all = map {
  14.         my $person = $_;
  15.         my %items = map {$_, 1} @{ $all{$person} };
  16.         $person, \%items;
  17. } sort keys %all;

  18. print Data::Dumper->Dump( [ \%ch_all ], [ qw(*ch_all) ] );
复制代码

论坛徽章:
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
3 [报告]
发表于 2016-09-10 23:06 |只看该作者
内层那个 map 返回的是
'Gilligan' => {  'luckey_socks' => 1, },
'Gilligan' => {'hat' => 1},
'Gilligan' => {'red_shirt'=>1},
'Gilligan' => {'water_bottle =>1},

键都一样,放在一个 hash 里自然就互相覆盖了

论坛徽章:
0
4 [报告]
发表于 2016-09-11 09:05 |只看该作者
回复 2# sunzhiguolu
谢谢大神,问题已解决~

论坛徽章:
0
5 [报告]
发表于 2016-09-11 09:19 |只看该作者
回复 3# zhlong8

好的,按照您的见解,确实与运行结果相符的。但是在要构建的哈希的外层中键 $person 是相同的,可是值的话 { $_ => 1 },其中 $_ 不是会改变的吗,不应该会覆盖掉的啊,请指教?

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2016-09-11 10:13 |只看该作者

在不同的上下文中,$_ 是不同的

本帖最后由 104359176 于 2016-09-11 10:18 编辑

$_ 在不同的上下文中是不同的。
你这样写,$_ 其实是一个上下文。



论坛徽章:
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
7 [报告]
发表于 2016-09-11 10:47 |只看该作者
本帖最后由 sunzhiguolu 于 2016-09-11 10:50 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $pos = 0;
  5. my @aColors = ([qw /red blue green/], [qw /black white/]);
  6. my %hPeople = map {
  7. my $who = $_;
  8. map { $who => {$_ => 1} } @{$aColors[$pos++]};
  9. } qw /Tom Jim/;

  10. for my $who (keys %hPeople){
  11.     my @aClrs = keys %{$hPeople{$who}};
  12.     print "$who favorite (@aClrs) colors.\n";
  13. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2016-09-11 11:44 |只看该作者
华小飞_Perl 发表于 2016-09-11 09:19
回复 3# zhlong8

好的,按照您的见解,确实与运行结果相符的。但是在要构建的哈希的外层中键 $person  ...
  1. <p>插入观察,说明数据是产生了的。结果不符合理想,可能与内层map的返回值,如何被perl解析有关。也许你这样写,perl就解析了最后一个数据。而按2楼的写法, perl就解析正确。</p><p>my %items = map {$_, 1} @{ $all{$person} };
  2. </p><p>$person, \%items;</p><p>
  3. </p><p>#!/usr/bin/perl

  4. use warnings;
  5. use strict;
  6. use Data::Dumper;


  7. my @gilligan = qw( red_shirt hat luckey_socks water_bottle );
  8. my @skipper = qw( blue_shirt hat jacket preserver sunscreen skirt);
  9. my @professor = qw( sunscreen water_bottle slide_rule batteries radio book);

  10. my %all = (
  11.         Gilligan  => \@gilligan,
  12.         Skipper   => \@skipper,
  13.         Professor => \@professor,
  14. );
  15. my @temp;  
  16. my %ch_all = map
  17. {
  18.     my $person = $_;
  19.     print $person."\n";
  20.       
  21.      map {
  22.                  print "$_\n";
  23.                  push @temp ,"$person ; { $_ => 1 }" ; #插入观察,说明数据是产生了的。        
  24.                 $person => { $_ => 1 }
  25.      } @{ $all{$person} };
  26.               
  27.            
  28. } sort keys %all;

  29. print ("@temp");#插入观察,说明数据是产生了的。

  30. print Data::Dumper->Dump( [ \%ch_all ], [ qw(*ch_all) ] );</p>
复制代码

论坛徽章:
0
9 [报告]
发表于 2016-09-11 12:43 |只看该作者
回复 6# 104359176
外层的 $_ 已经赋值给 $person 了,之后的 $_ 应该不是在另一个列表上下文了吗?请大神求教~

论坛徽章:
0
10 [报告]
发表于 2016-09-11 12:43 |只看该作者
回复 7# sunzhiguolu

多谢,按照您的方法,可以了~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP