Re: [問題] array reference

作者: l10nel (小失)   2012-04-24 07:22:13
※ 引述《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]
#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

Links booklink

Contact Us: admin [ a t ] ucptt.com