在my $var
和my ($var)
之间的差异上阅读了this question和this 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
之间没有任何区别。在这两种情况下,它都是哈希的标量引用,据我所知。
我错过了什么吗?
答案 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
。我甚至无法理解一个风格上的理由。这确实很奇怪。