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

Perl 将哈希引用传递给子例程的命名约定,perl,naming-conventions,Perl,Naming Conventions,当我将散列引用传递给子例程时,对于分配了hash ref参数的变量,什么是好的命名约定 在下面的示例中,更好的选项是什么: 使用与原始变量相同的变量名(并让Perl将原始变量隐藏在块中) 在子例程中为hash ref指定一个新名称 我倾向于使用选项1,因为相同哈希引用的新名称感觉是多余的 如果选项2更好,那么子例程中变量的命名约定是什么 ## example: use strict; use warnings; my $href_phone_book = generate_phone_boo

当我将散列引用传递给子例程时,对于分配了hash ref参数的变量,什么是好的命名约定

在下面的示例中,更好的选项是什么:

  • 使用与原始变量相同的变量名(并让Perl将原始变量隐藏在块中)
  • 在子例程中为hash ref指定一个新名称 我倾向于使用选项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;
    }
    

    您应该为变量引用的数据命名变量。理想情况下,您应该使用一个简短的不含糊的名称,并尽可能删除上下文。例如,如果您的函数所做的某项操作通常适用于任何哈希引用,则在IMO中,名称
    $hash\u ref
    $phone\u book
    更可取

    1。使用与原始变量相同的变量名(并让Perl将原始变量隐藏在块中)。

    虽然这不是一个一般安全的假设,但我会在你的例子中这样做。我将使用
    $phone\u book
    作为单个参数

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

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

    2。在子例程中为hash ref指定一个新名称?

    在这种情况下,这只是由于示例脚本的文件结构而必需的。一致性,至少在单个脚本和模块的级别上,比找到能够处理所有需要的特殊命名约定更重要



    我建议您阅读的变量命名约定章节。这是一个非常明确和有用的建议。

    我试图避免使用.pm文件来简化脚本的分发。虽然变量不是真正的全局变量,但从您的回答中我发现最好使用两个变量名(全局范围内的main_phone_book和子例程块内的$phone_book)。顺便说一句,在我的例子中,没有给出变量范围警告。将perl 5.10.1与use strict和warnings@edv:是的,我会使用两个变量,第一个全局变量的名称更复杂。即使Perl对重新分配的名称感到满意,我还是建议您使用不同的名称,因为在开发或维护过程中,您可能会混淆哪个是哪个。顺便说一下,你在问题中的
    $href\u phone\u book
    还可以-如果我在代码回顾中看到它,我不会抱怨这件事(当然我更喜欢自己的风格:-)。您也可以在单个
    .pl
    文件中使用包,尽管您需要担心的不仅仅是代码执行的顺序;如果你不打算关闭,那可能会更安全。