作者CindyLinz (Cindy Wang)
看板Perl
标题Re: [问题] ARRAY reference
时间Thu Mar 29 16:02:21 2012
※ 引述《cutecpu (可爱中央处理器)》之铭言:
: 问题一:
: 请问 Perl 有办法像 C 一样,可以将一个 pointer 指到 array 的某个
: index 吗?
: 例:
: C:
: int array[] = {1,2,3,4,5};
: int ptr = array + 2; /*
: 将 ptr 指向 &array[2]
: 所以 ptr[0] = 3
: ptr[1] = 4
: ptr[2] = 5
: */
: Perl:
: @array = (1,2,3,4,5);
: ########################################################
: # 有办法用什麽 reference 来达到上面 C 的功能吗?
: # 希望不要用复制阵列的方式 → @arr = @array[2..$#array];
: ########################################################
这个问题要达到你描述的那样, 最最基本上是不行.
(不过 perl 很灵活, TIMTOWTDI,
所以加工一下还是有方法做到)
reference 和 pointer 的主要差异,
就是 reference 不能作 pointer 的运算,
不可以 reference + 1 来取得所谓的下一项.
所以只提供 reference 而没有 pointer 的 runtime system
可以提供 garbage collection 的功能.
如果像 pointer 那样可以随意加减,
runtime system 无法知道到底有哪一个 address 是真的再也不会用到.
你可以弄一个 $ptr = \$array[2];
但是这样就只有 ref 到那一格, 而不是一整串;
如果你要做到一整串,
那麽也许可以考虑迂回一点包成一个物件,
这个物件里面有一个 array ref, 和一个 begin index,
存取的时候再去计算实际的那一项出来..
你可以考虑 perl tie 的功能,
(参考这边
http://perldoc.perl.org/perltie.html
和这边
http://perldoc.perl.org/Tie/Array.html )
你可以做出一个用起来就像正常 array 的东西,
而且不用复制原来的 array.
应该是完全符合你的需求.
(也有可能 CPAN 已经有这种 package 了, 不过我还没有去找)
: 问题二:
: Perl:
: @array = (1,2,3,4,5);
: @arr = @array[2..$#array];
: $ref = \@arr; # ←这样写 ok
: ##############################################
: # 想问的就是上面那行如果改成:
: # $ref = \(@array[2..$#array]);
: # 为什麽这时候的 $ref not an ARRAY reference?
: ##############################################
: 谢谢^_^
因为 @array / @arr 这样的写法是 array
而 @array[2..$#array] 是 @array 里面 2 ~ $#array 这几个元素排的 list
\@arr 是指向 @arr 的 ref
\(@array[2..$#array]) 是一排分别指向 @array 的 2 ~ $#array 元素的 ref
所以 $ref = \(@array[2..$#array]) 的话, $ref 的值应该是 \$array[$#array]
如果对於什麽时候是 array 什麽时候是 list 有一点困惑..
你可以这样去记:
array 和 list 是不一样的东西,
array 可以当 list 用,
list 不能当 array 用.
(但 list 可以指定到一个 array 里面去)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.242.246.249
1F:推 abliou:推阿!! 03/29 17:23
※ 编辑: CindyLinz 来自: 210.242.246.249 (03/29 17:44)
2F:推 xatier:推! 03/30 01:03
3F:推 dryman:push!! 03/30 12:55
4F:推 cutecpu:谢谢 Linz ! 回答的好详细 03/30 18:24