perl:hash的autoivivifcation作为object-> new()的参数?

时间:2015-01-13 06:18:37

标签: perl

来自perlootut:

  my $cage = File::MP3->new(
      path          => 'mp3s/My-Body-Is-a-Cage.mp3',
      content       => $mp3_data,
      last_mod_time => 1304974868,
      title         => 'My Body Is a Cage',
  );

我不明白这里发生了什么。它看起来是自动生成,如果是这样,那么new会传递类名和对新哈希的引用吗?

2 个答案:

答案 0 :(得分:5)

不涉及自动更新。使用=> operator

可能会让您感到困惑
  

=>运算符是逗号的同义词,不同之处在于,如果它以字母或下划线开头并且仅由字母,数字和下划线组成,则会使其左侧的单词被解释为字符串。

虽然在声明哈希值时经常使用=>,但它本身并不会创建哈希值。

您发布的代码等同于

my $cage = File::MP3->new(
    'path',          'mp3s/My-Body-Is-a-Cage.mp3',
    'content',       $mp3_data,
    'last_mod_time', 1304974868,
    'title',         'My Body Is a Cage',
);

这只是将八个项目的列表传递给new方法。

答案 1 :(得分:1)

=>也被称为胖逗号,它的行为就像一个逗号 - 除非:... / / p>

  1. 左边的内容是 bareword
  2. bareword 符合变量名称(即没有奇怪的字符)
  3. 在这种情况下,胖逗号将引用左侧的裸字。

    使用胖逗号是因为:

    1. 有些人发现输入胖逗号比在左边的裸字周围键入引号更容易

    2. 胖子逗号表示lhs和rhs之间的关系。然而,这种关系只是视觉上的 - 它取决于确定关系应该是什么的功能。

    3.   

      虽然=>通常在声明哈希时使用它,它不会创建一个   哈希本身。

      即便:

      use strict;
      use warnings;
      use 5.016;
      use Data::Dumper;
      
      my %href = (
          'a', 10,
          'b', 20,
          'c', 30,
      );
      
      say $href{'a'};
      
      say Dumper(\%href);
      
      
      --output:--
      10
      $VAR1 = {
                'c' => 30,
                'a' => 10,
                'b' => 20
              };
      

      perl ain&#tt ruby​​。