Re: [問題] ARRAY reference

看板Perl作者 (Cindy Wang)時間13年前 (2012/03/29 16:02), 編輯推噓4(400)
留言4則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《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

03/29 17:23, , 1F
推阿!!
03/29 17:23, 1F
※ 編輯: CindyLinz 來自: 210.242.246.249 (03/29 17:44)

03/30 01:03, , 2F
推!
03/30 01:03, 2F

03/30 12:55, , 3F
push!!
03/30 12:55, 3F

03/30 18:24, , 4F
謝謝 Linz ! 回答的好詳細
03/30 18:24, 4F
文章代碼(AID): #1FT1SFFK (Perl)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1FT1SFFK (Perl)