【问题标题】:Perl: How to correctly initialize a hash or arrayPerl:如何正确初始化散列或数组
【发布时间】:2013-07-08 13:10:10
【问题描述】:

通过几个在线教程,我注意到哈希或数组的初始化方式有所不同:

my %new_hash_1 = ();
# or
my %new_hash_2;

my @new_array_1 = ();
# or
my @new_array;

通过我将元素推入数组或将键值对添加到哈希的基本练习,我初始化变量的方式似乎并不重要。

通过进一步的谷歌搜索,我了解到:

%new_hash_1 = ();

有时用于清空现有哈希。

所以我想我的问题是:

  • 应该使用哪种方法来初始化哈希/数组?
  • 每种方法是否有特定的用途?或者这是 TIMTOWTDI 的一个例子?

非常感谢。

【问题讨论】:

    标签: arrays perl hash


    【解决方案1】:

    由于哈希和数组的构造方式,在声明它们时为它们分配一个空列表没有区别。它们仍将包含零个元素,并且您尝试从中读取的任何元素都将是未定义的。

    将空列表分配给哈希/数组的唯一目的是删除它已经拥有的任何值,并且在初始化时,它们不包含任何值。

    需要注意的是,数组和哈希只能包含标量值,并且只有标量值可以包含数据。

    【讨论】:

    • 如果您使用 mod_perl,our %hash;our %hash = (); 之间可能存在相当大的差异。前者可能会保留应用程序先前迭代的数据,具体取决于范围等。我通常确保在初始化哈希或数组时包含空括号,以避免这成为问题的可能性。
    • our 关键字与my 完全不同,是的。它不一定创建一个 new 变量,并且它具有“全局”变量的所有缺点,例如您提到的那个。
    • 您应该在声明所有变量时始终对其进行初始化。这样,您永远不会感到惊讶。
    • @AKHolland,这就是当您尝试使用包变量模拟词法变量时应该使用local our %hash; 的原因之一。在那里分配一个空列表同样没用。
    【解决方案2】:

    my %hash 创建一个新的空哈希。

    my @array 创建一个新的空数组。

    将空列表分配给新创建的哈希或数组是无用的噪音,因为它们已经是空的。

    【讨论】:

      【解决方案3】:

      两者都有效,但在维护方面,最好将它们分开,并用括号 () 初始化列表,用花括号 {} 初始化哈希,到目前为止,我的编码约定是: 我的 %new_hash_1 = {}; 我的 %new_list_1 = ();

      这样做的好处是让以后更新您的代码的人更容易做

      my %new_hash_1 = { 'a' => 1, 'b' => 2 };
      

      并且将帮助use strict;use warnings 更好地了解您在使用列表作为哈希时尝试执行的操作。

      我还建议您使用 PerlCritic http://search.cpan.org/~thaljef/Perl-Critic-1.118/lib/Perl/Critic.pm 来获取更多用户友好的消息。

      干杯, 杰尔。

      ps:请参阅 Oreilly Programming Perl (http://docstore.mik.ua/orelly/perl3/prog/ch09_04.htm) 中的哈希值

      【讨论】:

      • 这是不正确的。使用花括号将创建一个哈希 reference,如果您在哈希分配中使用它,您将收到错误 Odd number of elements in hash assignment。这:{} 是一个标量值,而不是一个列表。
      猜你喜欢
      • 1970-01-01
      • 2022-11-20
      • 2019-08-15
      • 2021-09-07
      • 1970-01-01
      • 2011-03-16
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多