为什么Dumper模块会在其设置哈希的分配周围放置parens?

时间:2017-05-24 01:24:11

标签: perl

my $varmy ($var)之间的差异上阅读了this questionthis question后,我仍然无法理解为什么Data :: Dumper模块在下面使用了parens摘自其代码。这些问题的答案中描述的差异似乎都不适用于此。

  my($s) = {
        level      => 0,           # current recursive depth
        indent     => $Indent,     # various styles of indenting
        # a bunch of other settings removed for brevity's sake
        deparse    => $Deparse,    # use B::Deparse for coderefs
        noseen     => $Sparseseen, # do not populate the seen hash unless necessary
       };

我在一个小脚本中对其进行了测试,我觉得将其声明为my ($s)my $s之间没有任何区别。在这两种情况下,它都是哈希的标量引用,据我所知。

我错过了什么吗?

2 个答案:

答案 0 :(得分:6)

我同意,这很奇怪。通常,赋值左侧的括号强制在列表上下文中而不是标量上下文中评估右侧。但是在上面的例子中没有任何结果。

但是,它似乎与Data :: Dumper中my(...) = ...的许多其他不必要的用法一致,例如:

sub Reset {
  my($s) = shift;
  $s->{seen} = {};
  return $s;
}

尽管如此,它并不一致,因为你也发现很多不使用的例子,例如:

my $ref = \$_[1];
my $v;

也许这是作者的偶然个人偏好,或者他们计划进行多项任务,并且从未清理过他们的代码...或者可能是多个具有不同偏好的作者犹豫不决地踩到对方的脚趾,或修复了什么他们认为没有破产。但那只是猜测......

答案 1 :(得分:4)

没有理由在这里使用my ($s)而不是my $s。我甚至无法理解一个风格上的理由。这确实很奇怪。