我只是初学者 这是我的一点浅见 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