Perl 哈希



  • 哈希

    哈希是存储标量值的有序列表的变量。哈希变量前面有一个“@”符号。要引用哈希的单个元素,将使用带符号名称的美元符号($),后跟方括号中的元素索引。
    这是使用哈希变量的简单示例-
    
    @ages = (25, 30, 40);             
    @names = ("John Paul", "Lisa", "Kumar");
    
    print "\$ages[0] = $ages[0]\n";
    print "\$ages[1] = $ages[1]\n";
    print "\$ages[2] = $ages[2]\n";
    print "\$names[0] = $names[0]\n";
    print "\$names[1] = $names[1]\n";
    print "\$names[2] = $names[2]\n";
    
    
    尝试一下
    在这里,我们仅在$符号之前使用了转义符号(\)进行打印。其他Perl会将其理解为变量并打印其值。执行后,将产生以下结果-
    
    $ages[0] = 25
    $ages[1] = 30
    $ages[2] = 40
    $names[0] = John Paul
    $names[1] = Lisa
    $names[2] = Kumar
    
    
    在Perl中,列表和哈希术语经常被使用,就好像它们是可互换的一样。但是列表是数据,而哈希是变量。
    哈希是一组键/值对。哈希变量前面带有百分号(%)。要引用哈希的单个元素,您将使用哈希变量名称,其前面带有“$”符号,然后是与大括号中的值关联的“键”。
    这是使用哈希变量的简单示例-
    
    %data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
    
    print "\$data{'John Paul'} = $data{'John Paul'}\n";
    print "\$data{'Lisa'} = $data{'Lisa'}\n";
    print "\$data{'Kumar'} = $data{'Kumar'}\n";
    
    
    尝试一下
    这将产生以下结果-
    
    $data{'John Paul'} = 45
    $data{'Lisa'} = 30
    $data{'Kumar'} = 40
    
    
  • 创建哈希

    哈希是通过以下两种方式之一创建的。在第一种方法中,您要一个一个地为命名键分配一个值-
    
    $data{'John Paul'} = 45;
    $data{'Lisa'} = 30;
    $data{'Kumar'} = 40;
    
    
    在第二种情况下,您使用一个列表,该列表是通过从列表中选取单个对来转换的:该对中的第一个元素用作键,第二个元素用作值。例如-
    
    %data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
    
    
    为了清楚起见,您可以使用=>作为的别名,以指示键/值对,如下所示:
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    
    
    这是上述形式的另一种形式,请看一下,这里所有键之前都带有连字符(-),并且在它们周围都不需要引号-
    
    %data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
    
    
    但是需要特别注意的是,只有一个单词,即没有空格键以这种散列形式使用,如果您以此方式建立散列,则只能使用连字符来访问键,如下所示。
    
    $val = %data{-JohnPaul}
    $val = %data{-Lisa}
    
    
  • 访问哈希元素

    从哈希访问单个元素时,必须在变量前加一个美元符号($),然后在变量名后的大括号内附加元素键。例如-
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    
    print "$data{'John Paul'}\n";
    print "$data{'Lisa'}\n";
    print "$data{'Kumar'}\n";
    
    
    尝试一下
    这将产生以下结果-
    
    45
    30
    40
    
    
  • 提取切片

    您可以提取哈希的切片,就像可以从数组中提取切片一样。您将需要对变量使用@前缀来存储返回的值,因为它们将是值列表-
    
    %data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
    
    @hash = @data{-JohnPaul, -Lisa};
    
    print "Array : @hash\n";
    
    
    尝试一下
    这将产生以下结果-
    
    Array : 45 30
    
    
  • 提取键和值

    您可以使用keys函数从哈希表中获取所有键的列表,该函数具有以下语法:
    
    keys %HASH
    
    
    此函数返回命名哈希的所有键的数组。以下是示例-
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    
    @names = keys %data;
    
    print "$names[0]\n";
    print "$names[1]\n";
    print "$names[2]\n";
    
    
    尝试一下
    这将产生以下结果-
    
    Lisa
    John Paul
    Kumar
    
    
    同样,您可以使用values函数来获取所有值的列表。此函数具有以下语法-
    
    values %HASH
    
    
    此函数返回一个普通数组,其中包含命名哈希的所有值。以下是示例-
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    
    @ages = values %data;
    
    print "$ages[0]\n";
    print "$ages[1]\n";
    print "$ages[2]\n";
    
    
    尝试一下
    这将产生以下结果-
    
    30
    45
    40
    
    
  • 检查存在性

    如果尝试从不存在的哈希访问键/值对,通常会得到未定义的值,并且如果打开了警告,则将在运行时生成警告。您可以通过使用exist函数解决此问题,如果命名键存在,则返回true,而不管其值可能是什么-
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    
    if( exists($data{'Lisa'} ) ) {
       print "Lisa is $data{'Lisa'} years old\n";
    } else {
       print "I don't know age of Lisa\n";
    }
    
    
    尝试一下
    在这里,我们介绍了 if... else 语句,将在单独的章节中进行研究。现在你只是假设,if(条件)只有当给定的条件为真,否则部分将被执行其他部分将会被执行。因此,当我们执行上述程序时,它会产生以下结果,因为此处存在给定条件($data {'Lisa'} 返回 true,则输出:Lisa is 30 years old
  • 获取哈希大小

    您可以通过使用键或值上的标量上下文来获取大小-即哈希中元素的数量。简单地说,首先您必须获取键或值组成的数组,然后可以按如下所示获取数组的大小:
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    
    @keys = keys %data;
    $size = @keys;
    print "1 - Hash size:  is $size\n";
    
    @values = values %data;
    $size = @values;
    print "2 - Hash size:  is $size\n";
    
    
    尝试一下
    这将产生以下结果-
    
    1 - Hash size: is 3
    2 - Hash size: is 3
    
    
  • 在哈希中添加和删除元素

    使用简单的赋值运算符,只需一行代码即可添加新的键/值对。但是要从哈希中删除元素,您需要使用delete函数,如示例中所示-
    
    %data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
    @keys = keys %data;
    $size = @keys;
    print "1 - Hash size:  is $size\n";
    
    # adding an element to the hash;
    $data{'Ali'} = 55;
    @keys = keys %data;
    $size = @keys;
    print "2 - Hash size:  is $size\n";
    
    # delete the same element from the hash;
    delete $data{'Ali'};
    @keys = keys %data;
    $size = @keys;
    print "3 - Hash size:  is $size\n";
    
    
    尝试一下
    这将产生以下结果-
    
    1 - Hash size: is 3
    2 - Hash size: is 4
    3 - Hash size: is 3