免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5064 | 回复: 7

請問map用法上的問題 [复制链接]

论坛徽章:
0
发表于 2011-07-20 16:09 |显示全部楼层
本帖最后由 afukada 于 2011-07-20 16:31 编辑

我現在想把一個array的元素和元素的index作成hash
比方說有一個array: @array=(A,B,C,D,E,F,G,H,I,J,K,L)
然後要產生一個新的hash: %hash=(A=>0,B=>1,C=>2,D=>3,E=>4,F=>5,G=>6,H=>7,I=>8,J=>9,K=>10,L=>11)
有一個方法是
for(0..11){$hash{$array[$_]}=$_}
我想這個應該是可以用map去作
可是有時候沒辦法會出現問題
比方說這個例子我用
%hash=map{$array[$_]=>$_}@array
結果會只有一組hash: %hash=(A=>L)
請問一下有高人可以指點一下嗎

论坛徽章:
0
发表于 2011-07-20 16:36 |显示全部楼层
  1. %hash = map {$array[$_], $_ } 0 .. $#array;
复制代码

论坛徽章:
0
发表于 2011-07-20 16:58 |显示全部楼层
本帖最后由 afukada 于 2011-07-20 17:00 编辑

謝謝
不過其實我想知道的是為什麼會有一些奇怪的狀況
比方說下面這個例子是要將1到12所有可能排列組合給列出來

&backtrace(0);

sub backtrace
{
        my ($num)=@_;
        my $i;
       
        if($num==12)
        {
                %seq_pos=map{$source[$_]=>$_}@source;#將數字和所在索引作成hash
                foreach(keys(%seq_pos)){print $_,"\t",$seq_pos{$_},"\n"}
        }
       
        for(1..12)
        {
                if(!$used[$_])
                {
                        $used[$_]=1;#紀錄用過的數字
                        $source[$num]=$_;#第n格填入數字n
                        &backtrace($num+1);#繼續列舉之後的維度
                        $used[$_]=0;#回收用完的數字
                }
        }
}

上面這個例子則會發生索引為0的元素不見
然後產生一個索引為12的空元素
結果如下
元素   索引
第一組
        12<-有一個索引為12的空元素
6       5
11      8
3       2
7       7
9       9
12      6
2       1
8       11
4       3
10      10
5       4
第二組
        12
6       5
11      8
3       2
7       7
9       11
12      6
2       1
8       10
4       3
10      9
5       4
...

實際上這個寫法我已經用過幾次
之前"看似"沒有問題
可是這次有發現了這個小bug
所以想問問看有沒有高手可以說明一下這些問題是怎麼產生的
這樣決定我要不要回去檢查那些程式

不過還是很感謝Cu_fans
你提供的方法很好
我會把他學起來

论坛徽章:
0
发表于 2011-07-20 17:27 |显示全部楼层
%seq_pos=map{$source[$_]=>$_}@source;#將數字和所在索引作成hash

这个能实现你需要的功能吗?

论坛徽章:
0
发表于 2011-07-20 17:47 |显示全部楼层
以這個例子來說(將1到12所有可能排列組合)
我整個代碼拿去跑是可行的
只是索引0會出錯(這個不會讀到)
還有就是會跑出一個索引12的空元素

可是像原本我舉的那個例子就整個不行
我猜是因為$_的問題
可是也沒有一個好的想法
其實也是可以用其他方法替代
只是我想知道為什麼有時候可以
有時候不行@@

论坛徽章:
0
发表于 2011-07-22 03:57 |显示全部楼层
@array=(A,B,C,D,E,F,G,H,I,J,K,L);
%hash=map{$array[$_]=>$_}@array

This doesn't work because $array[$_] expects numbered index (0,1,2...)
what's in $array[A]???

论坛徽章:
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
发表于 2011-07-22 10:06 |显示全部楼层
謝謝
不過其實我想知道的是為什麼會有一些奇怪的狀況
比方說下面這個例子是要將1到12所有可能排列組合給列 ...
afukada 发表于 2011-07-20 16:58



递归死循环.....

&backtrace(0);

sub backtrace
{   
...
                        &backtrace($num+1);#繼續列舉之後的維度
                        $used[$_]=0;#回收用完的數字
...
}

论坛徽章:
0
发表于 2011-07-22 18:35 |显示全部楼层
本帖最后由 moxnet 于 2011-07-22 18:38 编辑

代码逻辑有问题. 你的数值是从1开始的, 而数组的下标是从0开始的,这儿引起的问题
  1. #!/usr/bin/perl
  2. use Data::Dumper;
  3. use strict;
  4. use warnings;

  5. my @a = qw/1 2 3 4 5/;
  6. my %h = map {
  7.     print join(',', $a[$_], $_),"\n";
  8.     $a[$_] => $_ ;  } @a;

  9. print Dumper(\@a);
  10. print Dumper(\%h);
复制代码
输出:
  1. :! perl t
  2. 2,1
  3. 3,2
  4. 4,3
  5. 5,4
  6. Use of uninitialized value in join or string at t line 7.
  7. ,5
  8. Use of uninitialized value in list assignment at t line 7.
  9. $VAR1 = [
  10.           1,
  11.           2,
  12.           3,
  13.           4,
  14.           5
  15.         ];
  16. $VAR1 = {
  17.           '' => 5,
  18.           '4' => 3,
  19.           '3' => 2,
  20.           '2' => 1,
  21.           '5' => 4
  22.         };
复制代码
如果原始数组的元素是从0开始的, 输出就是ok的

:! perl t
0,0
1,1
2,2
3,3
4,4
5,5
$VAR1 = [
          0,
          1,
          2,
          3,
          4,
          5
        ];
$VAR1 = {
          '4' => 4,
          '1' => 1,
          '3' => 3,
          '0' => 0,
          '2' => 2,
          '5' => 5
        };
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP