作者reizarc (零式札克)
看板perl
标题Re: Hash of array问题
时间Sun Mar 4 16:23:14 2007
※ 引述《Pumbaa (aaa)》之铭言:
: ※ 引述《in2 (敬请期待 :P)》之铭言:
: : 应该是
: : %dram_dims = (
: : "rw" => ["WW", "RR", "WR"],
: : "bl" => ["FIXED_01", "UNFIX_01", "UNFIX_08", "UNFIX_16",
: : "UNFIX_32", "UNFIX_64", "FIXED_04", "FIXED_08", "FIXED_16"],
: : "rcb" => ["mode0", "mode1", "mode2", "mode3", "mode4", "mode5",
: : "mode6", "mode7"]
: : );
: : 你写的出来意义大概是
: : %tmp = ( "rw" => "WW" , "RR" => "WR" .... );
: : $dram_dims{ \%tmp } = undef;
: 先谢谢 :)
: 进一步我想问问 (), [], {}的差别是否如下面所说: (一直弄不太懂)
: 是否在给array或hash指定值的时候,该用 ()
: 而在给匿名 array / hash,或是给reference指定值的时候,是用 [] / {} 呢?
首先你要知道 $, @, % 是 perl 中的基本类型
() 可以给定的是 @, % 型态
而 [] {} 给定的则是一个 reference
在 perl 中, ref 同样用 $ 存
也就是说 你可以想像是指向不同资料结构的指标
( 而你可以用 ref 指令来看该 $ 指到的是什麽型态 )
举例来说
@aa = ( 1, 2, 3 ); # @aa 是一个 array
%ah = ( a=>1, b=>2, c=>3 ); # %ah 是一个 hash
$ar = [ 1, 2, 3 ]; # $ar 是一个 array 的 reference
: 或是他们的不同之处不是这样想的 @_@;
: 还有:array of array, hash of hash, array of hash, hash of array
: 在perl中是不是只能使用参照来作?
: 谢谢 m(_ _)m
是的 里面都是用 ref 的方式来完成
但是依然有很多类似 c++ 中的表示方式
像是
@a;
$a[ 0 ][ 0 ] = 0;
$a[ 1 ][ 1 ] = 1;
$a[ 2 ][ 2 ] = 2;
但是这样的写法
然而在 c++ 中
a 可以是 int* 的一个指标 ( 或是说 a[][] )
指向的记忆体将是一段连续的记忆体 index 的换算可以 run time 处理
( 也就是说 即使当成不同维度, index 都可以互相转换 )
然而此时在 perl 中 @a 代表的是什麽呢 ?
就是一个 array 而其中每个 scalar element 都是指向不同 array 的 reference
所以事实上
$a[ 0 ][ 0 ] = 0;
代表的是 $a[ 0 ]->[ 0 ] = 0;
但是在这种情况下 -> 是可以省略的 ( 因为一定是 reference, perl 直接默认 )
hash 的情况下也是同样的观念
所以如果以 c++ 来看的话
事实上就是 int **a 而不是 int a[][] 的形式
当然不完全相同啦 但是这样想的话很容易就可以理解了 :p
加上 perl 的自动默认处理的匿名型态 ( 有文章戏称发芽 听起来很欢乐 XD )
我的意思是说 只要你想 甚至可以这样作
my @a;
$a[ 1 ][ 2 ]{ a }{ bb }{ ccc }{ ddd }[ 30 ][ 400 ][ 5000 ]{ dizzy } = "@__@;";
也完全没问题 什麽 array hash 都可以管他去 XD
用的时候也不用想太多 perl 都帮你处理其中 refernece 的问题了 (Y)
结论就是 perl 里面可以用这些简单的基本型态和同样的观念 完成任意复杂的资料结构
其实是颇有趣的 也很直觉好用
... 只不过这些作法好像比较退流行了 >w<
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.216.175.24