我有一个全局定义的哈希引用,其值在添加后不会改变。因此,子程序不会修改哈希,只能访问它。
我是否应该将哈希引用传递给将使用其值的子例程,或者子例程是否应该引用全局变量本身?
另外,对于可读性而言,为子程序中定义的哈希值的相关值设置一个缩放器变量可能是不好的做法(避免使用long $ hash_ref-> {“abc”}语法,而使用$ abc)?
感谢。我在问,因为我想避免会导致我的代码变得混乱和冗余的事情。
答案 0 :(得分:3)
它差别很小。
全局数据的全局变量(文件范围的词汇)是完全可以接受的。
答案 1 :(得分:2)
嗯,这取决于,不是吗?如果您的脚本只能用于此特定数据,则无关紧要。如果您希望能够轻松更改数据,则可以将数据传递给子例程。
理想情况下,除了常量之外,我个人更喜欢封装。例如:
my $NORTH = 0;
my $SOUTH = 1; # constants
my $db = loadstuff("file"); # interchangeable data source
dostuff($db);
sub dostuff {
my $db = shift;
... # do stuff
}
这样,如果我之后阅读了代码,我可以看到子程序调用{{1}},而且我不必去寻找dostuff($db)
来自哪里。我也可以依赖$db
在这个子程序中保持不变:封装。
为了便于阅读,制作变量的临时副本是完全可以的,例如:
$db
但请注意,副本的更改当然不会影响原件。如果需要,您需要为变量设置别名,或使用引用。
答案 2 :(得分:1)
每次传递哈希可以缓解您对“全局数据”的任何紧张情绪。除了一个全局哈希之外,这还可以使哈希更自然地传递。在代码中,你有时会传递全局哈希,有时会传递其他哈希,需要参数(而不是“我已经传递了一个hashref?没有?那么我将使用全局的。”你的子程序中的逻辑)可以更容易地找到专门使用全局哈希的调用。
当您希望搜索代码以使用全局哈希时,处理中间引用会使其更加混乱。以前您可以搜索哈希的名称并查找每个用途;现在,您还必须搜索代码的更多本地化部分以使用中间引用。 OTOH,他们当然可以制作更清洁的代码。
所以,呃,这取决于。选择一条路径,如果它惹恼你,就选择另一条路径。