将哈希引用传递给子例程的命名约定

时间:2014-01-02 11:26:27

标签: perl naming-conventions

当我将哈希引用传递给子例程时,为其分配哈希引用参数的变量有什么好的命名约定?

在下面的示例中,有什么更好的选择:

  1. 使用与原始变量相同的变量名称(并让Perl隐藏块中的原始变量)。
  2. 在子程序中为哈希引用提出一个新名称?
  3. 我倾向于使用选项1,因为相同哈希引用的新名称感觉多余。

    如果选项2更好,那么子程序中变量的良好命名约定是什么?

    ## example:
    
    use strict;
    use warnings;
    
    my $href_phone_book = generate_phone_book();
    my $phone_number = get_phone_number($href_phone_book, "john");
    
    print $phone_number."\n";
    
    sub generate_phone_book {
    
        my %phone_book = (
    
            john => "5554321",
            alice => "5551234"
        );
    
        return \%phone_book;
    }
    
    sub get_phone_number{
    
        # Is it OK to hide the original variable
        my $href_phone_book = shift;
        # Or should I use a new variable name? What would then be a good naming convention?
    
        my $person = shift;
        my $phone_number = $href_phone_book->{$person};
    
        return $phone_number;
    }
    

1 个答案:

答案 0 :(得分:1)

您应该为他们引用的数据命名变量。理想情况下,您应该使用一个简短的非模糊名称,并尽可能删除上下文。例如,如果您的函数执行的操作通常适用于任何哈希引用,则名称$hash_ref将更适合IMO到$phone_book

<强> 1。使用与原始变量相同的变量名称(并让Perl隐藏块中的原始文件)。

虽然不是一般安全的假设,但 我会在你的例子中做什么。我会使用$phone_book作为单个参数。

注意,如果重复使用相同的参考数据结构作为函数的参数,那么它指向编写一些OO Perl。您应该创建一个类,数据结构是对象,函数已更改为实例方法。

警告:由于范围可变,您的示例脚本将生成警告。所以我的建议需要修改。我不会改变子例程的变量,而是将全局变量命名为$main_phone_book。 。 。但由于示例脚本的结构,这只是必需的。理想情况下,您应该避免全局数据结构,并使用模块化(包含处理电话号码的所有逻辑的PhoneBook.pm文件,无论是导出函数还是新类,由于包名称空间而不会在变量名称上发生冲突)。或者,如果变量对于手头的问题是真正全局的,那么你可能根本不会将它们作为参数传递。

<强> 2。在子程序中为哈希引用提出一个新名称?

在这种情况下,仅需要由于示例脚本的文件结构。至少在单个脚本和模块的层面上,一致性比找到一些可以满足您所有需求的特殊命名约定更重要。


我建议你阅读Perl Best Practices的变量命名约定章节。这是非常明确和有用的建议。