4

我有一个全局定义的哈希引用,其值在添加后永远不会改变。因此,子程序不会修改散列,只访问它。

我应该将哈希引用传递给将使用其值的子例程,还是应该让子例程引用全局变量本身?

此外,为子例程中定义的哈希的相关值设置一个缩放器变量以提高可读性可能是不好的做法(为了避免长 $hash_ref->{"abc"} 语法,使用 $abc)?

谢谢。我问是因为我想避免会导致我的代码变得混乱和冗余的事情。

4

3 回答 3

3

它几乎没有什么区别。

  • 临:
    • 很明显,潜艇使用了数据。
  • 缺点:
    • 很多不必要的打字。

全局数据的全局变量(文件范围的词法)是完全可以接受的。

于 2013-05-28T18:45:09.830 回答
2

嗯,这取决于,不是吗?如果您的脚本仅用于此特定数据,那没关系。如果您希望能够轻松更改数据,则将数据传递给子例程是可行的方法。

理想情况下,我个人更喜欢对除常量之外的所有内容进行封装。例如:

my $NORTH = 0;
my $SOUTH = 1;               # constants

my $db = loadstuff("file");  # interchangeable data source
dostuff($db);

sub dostuff {
    my $db = shift;
    ... # do stuff
}

这样以后再看代码,就可以看到子程序调用了dostuff($db),就不用到处去追查是$db从哪里来的了。我还可以依靠$db在这个子例程中保持不变:封装。

为了可读性,制作变量的临时副本是完全可以的,例如:

my $foo = $someref->{"foo"}[0];
my $bar = $someref->{"bar"}[0];

但请注意,对副本的更改当然不会影响原件。如果你愿意,你需要给变量起别名,或者使用引用。

于 2013-05-28T18:14:36.753 回答
1

每次传递哈希可以缓解您对“全球数据”的任何紧张情绪。除了一个全局散列之外,这还可以使散列更自然地传递。在代码中,您有时会传递全局散列,有时会传递其他散列,需要参数(而不是“我是否被传递了一个 hashref?不?然后我将使用全局散列。”在你的子例程中的逻辑)可以更容易地找到那些专门使用全局哈希的调用。

当您想要搜索代码以使用全局散列时,处理中间引用会使事情变得更加混乱。以前您可以搜索哈希的名称并找到每个用途;现在您还必须搜索代码的更多本地化部分以使用中间参考。OTOH,他们当然可以编写更清晰的代码。

所以,呃,这取决于。选择一条路,如果惹恼了你,就选择另一条路。

于 2013-05-28T18:15:36.230 回答