如何在 Perl 中将列表元素复制到哈希键?

use*_*254 4 arrays perl hash list

我找到了几种将列表元素复制到哈希键的方法,但是有人可以解释一下这是如何工作的吗?

#!/usr/bin/perl
use v5.34.0;

my @arry = qw( ray bill lois shirly missy hank );

my %hash;
$hash{$_}++ for @arry;  # What is happening here?

foreach (keys %hash) {
  say "$_ => " . $hash{$_};
}
Run Code Online (Sandbox Code Playgroud)

输出是我所期望的。我不知道任务是如何进行的。

hank => 1
shirly => 1
missy => 1
bill => 1
lois => 1
ray => 1
Run Code Online (Sandbox Code Playgroud)

TLP*_*TLP 6

$hash{$_}++ for @array;
Run Code Online (Sandbox Code Playgroud)

也可以写成

for (@array) {
    $hash{$_}++;
}
Run Code Online (Sandbox Code Playgroud)

或者更明确地说

for my $key (@array) {
    $hash{$key}++;
}
Run Code Online (Sandbox Code Playgroud)

$_是“默认输入和模式搜索空间”变量。通常在 Perl 函数中,您可以省略命名要使用的显式变量,并且它将默认使用$_. for就是一个例子。您还可以编写显式变量名称,这可能对您的代码来说信息更丰富:

for my $word (@words) 
Run Code Online (Sandbox Code Playgroud)

或者用惯用语来说:

for my $key (keys %hash)    # using $key variable name for hash keys
Run Code Online (Sandbox Code Playgroud)

您还应该意识到 Perl 中的forforeach是完全相同的。它们是同一函数的别名。因此,我总是使用它,for因为它更短。

代码的第二部分赋值,使用自增运算符++

它被附加到 LHS 上的变量并将其值增加 1。例如

$_++           means $_ = $_ + 1
$hash{$_}++    means $hash{$_} = $hash{$_} + 1
...etc
Run Code Online (Sandbox Code Playgroud)

它还包含一定的 Perl 魔力,您可以在文档中阅读更多相关信息。在这种情况下,这意味着它甚至可以增加未定义的变量而不发出警告。当涉及到初始化事先不存在的哈希键时,这是理想的选择。

您的代码将为@arry列表中的每个单词初始化一个哈希键,并计算每个单词的出现次数。在本例中恰好是 1。这是需要指出的,因为由于哈希键是唯一的,因此您的数组列表可能比哈希中的键列表大,因为某些键会相互覆盖。

$hash{$_}++ for @array;
Run Code Online (Sandbox Code Playgroud)