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)
$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 中的for
和foreach
是完全相同的。它们是同一函数的别名。因此,我总是使用它,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)