Re: [問題] array reference

作者: abliou (愚者)   2012-04-24 11:26:30
我只是初學者 這是我的一點淺見 orz
我是覺得cutecpu前輩提出的問題真的很有趣
※ 引述《l10nel (小失)》之銘言:
: ※ 引述《cutecpu (可愛中央處理器)》之銘言:
: : 想請問為什麼:
: : #!/usr/bin/perl -w
: : @arr = (1,2,3);
: : print @arr[2];
: : 會出現:「Scalar value @arr[2] better written as $arr[2] at ./g.pl line 5.」
: : 而以下 code 卻不會
: : #!/usr/bin/perl -w
: : @arr = (1,2,3);
: : $ref = \@arr;
: : print @$ref[2]; # 我一直以為要寫成 ${$ref}[2] or $$ref[2] 才是對的
: : 謝謝^_^
: 很訝異 4、7、8 都是可行的(印出正確結果),但避免為宜。
: use warnings;
: use strict;
: my @arr = (1,2,3);
: print $arr[2]; #3 1:正確寫法
: print ${arr[2]}; #3 2:同1但沒必要
: print ${arr}[2]; #3 3:同1但沒必要
: print @arr[2]; #3 4:驚訝,這樣在Perl 5.10竟然也行!何時開始可行的?
: # 這的確是Perl 6的標準語法,
: # 難道Perl 5向Perl 6借了新功能?
: # 在 use warnings; 下遭到警告:Scalar value @arr[2]
: # better written as $arr[2]
我比較想提出的看法是在這邊 @arr[1]這種用法我很久前就開始用了
那時候好像perl 6架構也都還沒有出來
這語法我認為最大的價值就在於 有時候在對array做sliding時
並不會知道需要切多少出來
例如我要從array A中找出符合的ID 再去array B調出符合的紀錄
如果符合條件的只有一個元素 就會出問題
那強制鎖定單數要用$ 在實作上似乎就不是那麼必要 而且可能還會造成程式員的負擔
(因為要先確定元素個數有幾個 再來決定前置符號 光是這點就有些麻煩)
後來的perl 6有對這部分改進 印象中理由就是
"大家從array中取值出來 如果用@會比較容易理解" 當然我是覺得有好有壞
如果是用Larry產品的人應該都知道他是"西方"語言學家 那邊的語言名詞都有單複數之別
相對的在"東方"語系對於名詞的單複數就不是要求那麼嚴格
這種修改有可能跟Larry的語言上的美學有衝突 但對於使用perl實作時
的確是有些許幫助 (雖然也是會失去判別該變數的單複數區別能力 trade off的問題)
: #print {@arr}[2]; #3 語法錯誤,大括號通常不該圍住最前頭的 @ $ 等符號
: my $ref = \@arr;
: print "\n";
: print @$ref; #123 5:這是從$ref還原(dereference)陣列的標準做法
: print "\n";
: print $ref->[2]; #3 6:以$ref取陣列元素的標準做法,用->避開煩人的大括號
: print @$ref[2]; #3 7:以下7-10都同6,都能成功取得元素[2],但前頭涉及
: # 兩個符號,後面還接 [...],
: print @{$ref}[2]; #3 8: 若再加大括號,非常煩人,這就是Perl令人詬病處,
: # 能寫成6的地方
: print $$ref[2]; #3 9: 應該儘量避免寫成7-10
: print ${$ref}[2]; #3 10:
: ===
: OUTPUT:
: 3333 <- 1-4 各印出一個3
: 123 <- 陣列全部內容
: 33333 <- 6-10 各印出一個3
作者: l10nel (小失)   2012-04-25 03:30:00
我也同意Perl 6這部份的改進很好,凡是與array有關的,無論全陣列或單項元素一律是@,這樣就清楚了。可惜Perl 6正式版遙遙無期,不知要等到哪一年的聖誕節~
作者: abliou (愚者)   2012-04-25 15:15:00
但就我的經驗 其實還是有不好的地方 尤其有時候在debug時不能否認的 前置符號有時候可以加快我debug的時間 當然這就是文中講的trade off的問題 畢竟有一好沒有二好或者應該說 "都很好"

Links booklink

Contact Us: admin [ a t ] ucptt.com