Perl中的嵌套解除引用箭头:省略或不省略?

DVK*_*DVK 7 syntax perl coding-style

在Perl中,当你有一个嵌套的数据结构时,允许省略取消引用箭头到2d和更多嵌套级别.换句话说,以下两个语法是相同的:

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
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,是否有充分的理由选择一种风格而不是另一种风格

它似乎是风格争论的流行之骨(Just on SO,我不小心碰到了这个,在5分钟的时间内).

到目前为止,几乎所有通常的嫌疑人都没有明确表示:

  • perldoc只是说"你可以省略指针解除引用箭头".
  • Conway的"Perl最佳实践"说"尽可能使用箭头取消引用",但它似乎仅适用于解除引用主引用的上下文,而不适用于嵌套数据结构的2d级别的可选箭头.
  • "掌握Perl for Bioinfirmatics"作者James Tisdall也没有给出非常可靠的偏好:

    "明智的读者可能已经注意到我们似乎在数组下标之间省略了箭头操作符.(毕竟,这些是匿名数组的匿名数组的匿名数组等,所以不应该写它们[$ array- > [$ i] - > [$ j] - > [$ k]?)Perl允许这样做;只需要变量名和第一个数组下标之间的箭头操作符.它使眼睛更容易,有助于避免腕骨隧道综合症.另一方面,您可能更愿意保留解除引用箭头,以明确您正在处理引用.您的选择."

  • 更新的 "中级Perl",根据其共同作者brian d foy,建议省略箭头.请参阅下面的brian的完整答案.

就个人而言,我站在"总是放箭头,因为它更具可读性和显而易见性,他们正在处理参考".

更新更具体的re:可读性,在多嵌套表达式的情况下,下标本身是表达式,箭头通过更明显地将下标彼此分开来帮助"在视觉上标记化"表达式.

bri*_*foy 14

除非您真的喜欢打字或过长的线条,否则不要在不需要时使用箭头.下标旁边的下标意味着引用,因此有能力的程序员不需要额外的线索来解决这个问题.

我不同意额外的箭头更具可读性.让他们将这个词的有趣部分进一步远离彼此是绝对不同寻常的.

Intermediate Perl中,我们实际教授参考文献,我们告诉您省略不必要的箭头.

另外,请记住,没有"可读性"这样的东西.只有你(和其他人)训练你的眼睛才能识别为模式.你不会逐字逐句地阅读它们,然后弄清楚它们的含义.您可以看到之前见过的事物组并识别它们.在您所讨论的基本语法级别,您的"可读性"只是您识别模式的能力.您使用它越多,识别模式就越容易,因此您现在所做的事情对您来说更具"可读性"并不奇怪.新的风格起初看起来很奇怪,但最终变得更容易识别,因此更具"可读性".

您在评论中提供的示例并不难阅读,因为它缺少箭头.用箭头读起来仍然很难:

 $expr1->[$sub1{$x}]{$sub2[$y]-33*$x3}{24456+myFunct($abc)}
 $expr1->[$sub1{$x}]->{$sub2[$y]-33*$x3}->{24456+myFunct($abc)}
Run Code Online (Sandbox Code Playgroud)

我编写这样的代码,使用这些变量名来提醒下一个编码器每个级别的容器类型:

my $index = $sub1{$x};
my $key1  = $sub2[$y]-33*$x3;
my $key2  = 24456+myFunct($abc);

$expr1->[ $index ]{ $key1 }{ $key2 };
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,将细节隐藏在子程序中(这就是它们的用途:)所以你永远不必直接使用那些混乱的数据结构.这比任何一个都更具可读性:

  my $value = get_value( $index, $key1, $key2 );

  my $value = get_value(
  $sub1{$x},
   $sub2[$y]-33*$x3,
   24456+myFunct($abc)
      );
Run Code Online (Sandbox Code Playgroud)