Chinaunix

标题: 如何用一个变量值命名一个hash的array? [打印本页]

作者: gunguymadman    时间: 2004-12-14 10:07
标题: 如何用一个变量值命名一个hash的array?
如何以一个变量的值来命名hash的array?
作者: 一梦如是    时间: 2004-12-14 10:44
标题: 如何用一个变量值命名一个hash的array?
你是想用变量的值做哈希的值?还是做哈希的键?
前者就直接存就行了,后者请见http://bbs.chinaunix.net/forum/25/20041213/465273.html
斑竹的回答
作者: gunguymadman    时间: 2004-12-14 11:15
标题: 如何用一个变量值命名一个hash的array?
呵呵  
我的本意不是这样的   
我想要的是用一个循环中的变量的值来命名每次生成的新数组 ( 变量值是作为新数组的名字 )  
例如 $one="aaa"; 则生成一个@aaa=();
到下一个循环了 ,此时$one编程“bbb",则再生成一个@bbb=[],(数组的元素是hash,这是后话,跟现在的问题没什么关系 )。
我现在生成不了对应于变量值的数组  ?? who知道如何实现?
作者: gunguymadman    时间: 2004-12-14 12:13
标题: 如何用一个变量值命名一个hash的array?
解决了   但不严格
作者: deathcult    时间: 2004-12-14 12:16
标题: 如何用一个变量值命名一个hash的array?

  1. #!/usr/bin/perl

  2. use Data::Dumper;


  3. my $h;
  4. $h->;{'a'} = "1";
  5. $h->;{'b'} = "2";

  6. print Dumper($h);
复制代码

作者: 一梦如是    时间: 2004-12-14 13:03
标题: 如何用一个变量值命名一个hash的array?

  1. #!/bin/perl -w
  2. use strict;
  3. no strict 'refs';
  4. my $a="aaa";
  5. @{"$a"}=qw(1 2 3);
  6. print @{"$a"};
复制代码



  1. #!/bin/perl -w
  2. #use strict;
  3. my $a="aaa";
  4. open (F,">;tmp");
  5. @{print F $a}=qw(1 2 3);
  6. print @{print F $a};
  7. close F;
  8. unlink 'tmp';
复制代码

作者: 一梦如是    时间: 2004-12-14 13:13
标题: 如何用一个变量值命名一个hash的array?
sorry,两个程序都有问题,在程序尾加上

  1. print @aaa;
复制代码

后,就会发现@aaa没有被定义~
但是谁能帮我解释下,我的程序里列表值被存储到哪里去了?程序是怎么解释的?
而且为什么@{print F $a}=qw(1 2 3); @{"$a"}=qw(1 2 3);两句都不报错?
作者: gunguymadman    时间: 2004-12-14 14:21
标题: 如何用一个变量值命名一个hash的array?
  1. #!/usr/bin/perl

  2. #use strict;
  3. no strict 'refs';
  4. my $b="array";

  5. push @{$b},{"1"=>;"aaaaaaa"};
  6. push @{$b},{"2"=>;"sssssssss"};

  7. print ${$b}[0]->;{1},"\n";
  8. print $array[1]->;{2},"\n";
复制代码

作者: gunguymadman    时间: 2004-12-14 14:24
标题: 如何用一个变量值命名一个hash的array?
呵呵  dumper可以解决
作者: 一梦如是    时间: 2004-12-14 15:54
标题: 如何用一个变量值命名一个hash的array?
刚才是我想错了,我觉得这样更好些~

  1. #!/bin/perl
  2. #use strict;
  3. no strict 'refs';
  4. my $a="array";
  5. *{$a}=[1,2,3];
  6. print @array;
复制代码

作者: gunguymadman    时间: 2004-12-14 16:21
标题: 如何用一个变量值命名一个hash的array?
这叫什么  指针??
作者: 一梦如是    时间: 2004-12-14 16:33
标题: 如何用一个变量值命名一个hash的array?
符号项,把匿名数组的引用传给数组引用。
对于程序的工作情况,我是这么理解的:因为这个数组不存在,所以先创建这么个数组(这里是perl自动激活了这么个创建过程),再将匿名数组中的值传给了新创建的数组本身(这里似乎也是自动激活了传值过程,我们只传了引用,但它把值传过去了,不是么)。
也许我的理解有误,请高手指教我说的对不对。
作者: flw    时间: 2004-12-14 18:08
标题: 如何用一个变量值命名一个hash的array?
对于“一梦如是”写的代码,
我的理解是这样的:
  1. *{$a}=[1,2,3];
复制代码

首先呢,根据上下文词法环境,{} 表示了一个代码块,它的执行结果就是 "array" 这个字符串。
其次,* 号和后面的{$a}构成了一个解引用的操作。
按照语法规定,解引用需要一个引用。
但是因为{$a}本身并不是引用,而是一个字符串,
所以 Perl 尝试“符号引用”(注1),也就是说,
上面的代码实际上等效于
  1. *array=[1,2,3];
复制代码

因为匿名数组 [1,2,3] 返回的是一个指向数组的引用,
所以
  1. *array=[1,2,3];
复制代码

从功能上讲,
等效于
  1. @tmp_array = ( 1, 2, 3 );
  2. *array = \@tmp_array;
复制代码

而这正好是一个“有选择的别名”的语法格式,
其效果就是在符号表中创建一个名为“array”的符号项,
且使 array 所指向的 typeglob 结构中的 @array 项指向列表 (1,2,3)。


现学现卖,只能糊弄过自己
请高手继续指教!


注1:
前提是用 no strict 'refs'; 打开这个开关。
作者: 一梦如是    时间: 2004-12-14 19:42
标题: 如何用一个变量值命名一个hash的array?
感谢斑竹,解我之惑,拆解的很好,只有一点小瑕
因为匿名数组 [1,2,3] 返回的是一个指向数组的引用

这句没错
且把 @array 的值置为 [1,2,3] 的值

这句有点问题,虽然一定是笔误,但希望更正,因为说不定会误导大家,请述小子狂妄。
作者: flw    时间: 2004-12-15 09:10
标题: 如何用一个变量值命名一个hash的array?
已经改过了,用红色字体标出了。
请你再看看,是不是还不对?
作者: 一梦如是    时间: 2004-12-15 09:23
标题: 如何用一个变量值命名一个hash的array?
    
作者: gunguymadman    时间: 2004-12-15 09:29
标题: 如何用一个变量值命名一个hash的array?
收到   受益匪浅啊  
有时间好好研究研究
作者: Qiang    时间: 2004-12-19 13:14
标题: 如何用一个变量值命名一个hash的array?
原帖由 "gunguymadman" 发表:
我想要的是用一个循环中的变量的值来命名每次生成的新数组 ( 变量值是作为新数组的名字 )
例如 $one="aaa"; 则生成一个@aaa=();
到下一个循环了 ,此时$one编程“bbb",则再生成一个@bbb=[],


请使用 hash 和 匿名数组来解决类似的问题.  比如说$hash{$array_name} = [1,2,3] ;

推荐每个perl 程序使用 use strict 是有原因的, 尽量避免使用 no strict refs. 类似的问题有人问过了.
http://bbs.chinaunix.net/forum/viewtopic.php?t=468611&show_type=
作者: gunguymadman    时间: 2004-12-21 21:39
标题: 如何用一个变量值命名一个hash的array?
嗯  。。
我要的数据的结构较复杂
是hash的array的array   还要对hash键值处理  而且顺序不变
如果变成array的hash的array      次序改变 array值的访问次数也不好确定..

想来若是hash的hash的array会更好吧   
但是数据量太大   空间和速度恐怕会吃不消。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2