我想在这里理解你:
- 你有一个数组和一个哈希。
- 您想计算数组中的项目并查看它们出现的次数
- 但是,只有当这个项目在你的哈希中。
将哈希视为键控数组。数组有一个位置。您可以谈论第 0 个元素或第 5 个元素。只有第 0 个元素,它们只有第 5 个元素。
让我们看一个哈希:
my %jobs;
$jobs{bob} = "banker";
$jobs{sue} = "banker";
$jobs{joe} = "plumber;
就像我们可以谈论数组中第 0 位的元素一样,我们可以谈论带有 of 的元素bob
。就像第 0 位只有一个元素一样,也只能有一个键为 的元素bob
。
哈希提供了一种快速查找信息的方法。例如,我可以快速找出 Sue 的工作:
print "Sue is a $jobs{sue}\n";
我们有:
- 一个充满项目的数组。
- 包含我们要计算的项目的哈希
- 另一个带有总数的哈希。
这是代码:
use strict;
use warnings;
use feature qw(say);
my @items = qw(.....); # Items we want to count
my %valid_items = (....); # The valid items we want
# Initializing the totals. Explained below...
my %totals;
map { $totals{$_} = 0; } keys %valid_items;
for my $item ( @items ) {
if ( exists $valid_items{$item} ) {
$totals{$item} += 1; #Add one to the total number of items
}
}
#
# Now print the totals
#
for my $item ( sort keys %totals ) {
printf "%-10.10s %4d\n", $item, $totals{$item};
}
map命令获取右侧的项目列表(在我们的例子中),keys %valid_items
并遍历整个列表。
因此:
map { $totals{$_} = 0; } keys %valid_items;
是一种简短的说法:
for ( 键 %valid_items ) { $totals{$_} = 0; }
我使用的其他东西是键,它以数组(好的列表)的形式返回我的哈希的所有键。因此,我回来了apple
,,当我说。banana
oranges
keys %valid_items
exists`[exists](http://perldoc.perl.org/functions/exists.html) is a test to see if a particular key is in my hash. The value of that key might be zero, a null string, or even an undefined value, but if the key is in my hash, the
函数将返回一个真值。
但是,如果我们可以使用exists
来查看密钥是否在我的%valid_items
哈希中,我们可以使用%totals
. 它们具有相同的密钥集。
相反,或者创建一个%valid_items
哈希,我将使用一个@valid_items
数组,因为数组比哈希更容易初始化。我只需要列出这些值。我可以使用以下命令,而不是使用keys %valid_items
获取键列表@valid_items
:
use strict;
use warnings;
use feature qw(say);
my @items = qw(banana apple orange apple orange apple pear); # Items we want to count
my @valid_items = qw(banana apple orange); # The valid items we want
my %totals;
map { $totals{$_} = 0; } @valid_items;
# Now %totals is storing our totals and is the list of valid items
for my $item ( @items ) {
if ( exists $totals{$item} ) {
$totals{$item} += 1; #Add one to the total number of items
}
}
#
# Now print the totals
#
for my $item ( sort keys %totals ) {
printf "%-10.10s %4d\n", $item, $totals{$item};
}
这打印出来:
apple 3
banana 1
orange 2
我喜欢使用printf来保持表格整洁有序。