gpt4 book ai didi

perl - Perl 中的嵌套解引用箭头 : to omit or not to omit?

转载 作者:行者123 更新时间:2023-12-04 10:02:21 25 4
gpt4 key购买 nike

在 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

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

它似乎是一个流行的风格争论的焦点(就在 SO 上,我不小心在 5 分钟内碰到了 thisthis)。

到目前为止,几乎没有一个通常的嫌疑人说任何明确的事情:
  • perldoc只是说“您可以随意省略取消引用箭头的指针”。
  • Conway 的“Perl 最佳实践”说“只要有可能,用箭头取消引用”,但它似乎只适用于取消引用主要引用的上下文,而不适用于嵌套数据结构的二维级别上的可选箭头。
  • “掌握 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 的说法,建议省略箭头。请参阅下面布赖恩的完整回答。

  • 就我个人而言,我站在“总是把箭头放在一边,因为它更具可读性和明显他们正在处理引用”。

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

    最佳答案

    除非您真的很喜欢打字或过长的行,否则不要在不需要时使用箭头。下标旁边的下标表示引用,因此有能力的程序员不需要额外的线索来弄清楚这一点。

    我不同意有额外的箭头更具可读性。让他们将术语中有趣的部分相互远离,这绝对是非常规的。

    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)
    );

    关于perl - Perl 中的嵌套解引用箭头 : to omit or not to omit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2475042/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com