my $hash_ref = { 1 => [ 11,12,13 ],3 => [31,32] }; my $elem1 = $hash_ref->{1}->[1]; my $elem2 = $hash_ref->{1}[1]; # exactly the same as above
现在,我的问题是,是否有充分的理由选择一种风格而不是另一种风格?
它似乎是风格争论的流行骨头(Just on SO,我不小心在5分钟内碰到了this和this).
到目前为止,几乎所有通常的嫌疑人都没有明确表示:
> perldoc只是说“你可以省略指针解除引用箭头”.
> Conway的“Perl最佳实践”说“尽可能使用箭头取消引用”,但它似乎仅适用于取消引用主要引用的上下文,而不适用于嵌套数据结构的2d级别的可选箭头.
>“掌握Perl for Bioinfirmatics”作者James Tisdall也没有给出非常可靠的偏好:
“The sharp-witted reader may have
noticed that we seem to be omitting
arrow operators between array
subscripts. (After all,these are
anonymous arrays of anonymous arrays
of anonymous arrays,etc.,so
shouldn’t they be written
[$array->[$i]->[$j]->[$k]?) Perl
allows this; only the arrow operator
between the variable name and the
first array subscript is required. It
make things easier on the eyes and
helps avoid carpal tunnel syndrome. On
the other hand,you may prefer to keep
the dereferencing arrows in place,to
make it clear you are dealing with
references. Your choice.”
>更新的“中级Perl”,根据其合着者brian d foy,建议省略箭头.请参阅下面的brian的完整答案.
就个人而言,我站在“总是放箭头,因为它更可读,更明显他们正在处理参考”.
更新更具体的re:可读性,在多嵌套表达式的情况下,下标本身是表达式,箭头通过更明显地将下标彼此分开来帮助“在视觉上标记化”表达式.
解决方法
我不同意额外的箭头更具可读性.让他们将这个词的有趣部分进一步远离彼此是绝对不同寻常的.
在Intermediate Perl,我们实际教导参考,我们告诉你省略不必要的箭头.
另外,请记住没有“可读性”这样的东西.只有你(和其他人)训练你的眼睛才能识别为模式.你不会逐字逐句地阅读它们,然后弄清楚它们的含义.您可以看到之前见过的事物组并识别它们.在您所讨论的基本语法级别,您的“可读性”只是您识别模式的能力.您使用它越多,识别模式就越容易,因此您现在所做的事情对您来说更具“可读性”并不奇怪.新的风格起初看起来很奇怪,但最终变得更容易识别,因此更具“可读性”.
您在评论中提供的示例不难阅读,因为它缺少箭头.用箭头读起来仍然很难:
$expr1->[$sub1{$x}]{$sub2[$y]-33*$x3}{24456+myFunct($abc)} $expr1->[$sub1{$x}]->{$sub2[$y]-33*$x3}->{24456+myFunct($abc)}
我编写这样的代码,使用这些变量名称来提醒下一个编码器每个级别的容器类型:
my $index = $sub1{$x}; my $key1 = $sub2[$y]-33*$x3; my $key2 = 24456+myFunct($abc); $expr1->[ $index ]{ $key1 }{ $key2 };
为了做得更好,将细节隐藏在子程序中(这就是它们的用途:)所以你永远不必直接使用那些混乱的数据结构.这比任何一个都更具可读性:
my $value = get_value( $index,$key1,$key2 ); my $value = get_value( $sub1{$x},$sub2[$y]-33*$x3,24456+myFunct($abc) );