免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2192 | 回复: 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
13 [报告]
发表于 2016-09-11 15:26 |只看该作者
7 楼的代码我想说, 将列表转换成 hash 的过程中 key 值相同的情况下 后续的 "value" 会替换先前的哪些 "value". 与 "value" 的类型无关
zhlong8 版主解释的非常详细了.
Jason680 大神的代码简单高效, 的确很厉害!

论坛徽章:
0
12 [报告]
发表于 2016-09-11 14:15 |只看该作者
回复 11# jason680

大神就是大神,解决了,谢谢!

论坛徽章:
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
11 [报告]
发表于 2016-09-11 13:25 |只看该作者
本帖最后由 jason680 于 2016-09-11 13:27 编辑

回复 9# 华小飞_Perl

which one do you like ...

1. one hash only
my %all = (
        Gilligan  => { map {$_=>1} @gilligan  },
        Skipper   => { map {$_=>1} @skipper   },
        Professor => { map {$_=>1} @professor },
);



2. modified some code ...
my %ch_all = map {
        my $person = $_;
        map { $person => { $_ => 1 } } @{ $all{$person} };

} sort keys %all;


        my $person = $_;
        $person => { map {$_=>1} @{$all{$person}} };

or combine together

        $_ => { map {$_=>1} @{$all{$_}} };


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

多谢,按照您的方法,可以了~

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

论坛徽章:
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>
复制代码

论坛徽章:
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. }
复制代码

求职 : 软件工程师
论坛徽章:
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 编辑

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



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

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP