我有两个数组:
my @name = (bob, bob, dave, john, john, mary, mary, mary);
my @cost = (5, 7, 4, 4, 4, 6, 3 , 4);
我想将它们映射在一起,所以输出就是:
bob 12
dave 4
john 8
mary 13
数组的变化虽然所以我不能使用引用。如何按@cost
对@name
进行分组,并添加@cost
的值?
答案 0 :(得分:6)
将消耗输入的更多的代码:
my %Cost_by_Name;
while (@name & @cost) {
$Cost_by_Name{shift @name} += shift @cost;
}
..因为源数据不值得活着。
答案 1 :(得分:4)
一些map诡计:
my %hash;
%hash = map {$name[$_] => $hash{$name[$_]} += $cost[$_]} 0..$#name;
就个人而言,我会选择for()
或while()
循环解决方案,因为一眼就能看到发生的事情要容易得多。
答案 2 :(得分:3)
我会尝试这样的事情。
#!/usr/bin/perl
use strict; use warnings; use Data::Dumper;
my @name = qw(bob bob dave john john mary mary mary);
my @cost = qw(5 7 4 4 4 6 3 4);
my %seen = ();
foreach(0..scalar(@name)-1){
if (!exists $seen{$name[$_]}){
$seen{$name[$_]} = $cost[$_];
}
else{
my $sum = 0;
$sum = $seen{$name[$_]};
my $new = $sum + $cost[$_];
$seen{$name[$_]} = $new;
}
}
print Dumper(\%seen);
<强>输出:强>
$VAR1 = {
'bob' => 12,
'john' => 8,
'dave' => 4,
'mary' => 13
};
答案 3 :(得分:2)
这样的事情应该有效:
$this->load->database();
$this->load->dbutil();
// check connection details
if( !$this->dbutil->database_exists('myDatabase'))
echo 'Not connected to a database, or database not exists';
然后你只需循环遍历数组即可获得总费用:
my %myHash = ();
for (my $i=0 ; $i<$#name ; $i++) {
$myHash{$name[$i]} += $cost[$i];
}