2017-02-21 8 views
0

に重複したエントリを持つ数学は、私は2つの配列を持っている:perlの配列

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

結果で新しい配列を作成するか、結果だけを出力しますか? –

+1

ハッシュを使用して、 '@ name'のキーの値に' @ cost'の値を加えます。 – AntonH

+0

とにかくいいです。私は印刷された出力を '' bob '= 12' dave '= 4'などにしたいと思っています。今、私はちょうど数学に固執しています。 – cflinspach

答えて

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); 

OUTPUT:

$VAR1 = { 
    'bob' => 12, 
    'john' => 8, 
    'dave' => 4, 
    'mary' => 13 
}; 
+4

FWIW:おそらく、 'スカラー(@name)-1 'の代わりに' $#name'に反復するでしょう。また、自動化を利用すると、 'if'節を捨てて、' else'ブロックに含まれているものだけを実行することができます。 – tjd

+0

@tjd実際、それは良いでしょうが、私はこれらの単純な行を使うのが好きです。時々、いくつかの機能を理解するのが難しくなります。 – AbhiNickz

+1

'if(!...){...} else {...}'と表示されるといつも不快に感じます。確かにそれはif/else節を使って書かれたほうが良く、条件の中から '!'が取り除かれた方が良いでしょう。しかし、tjdが指摘するように、自動化は、あなたがそのチェックを全く必要としないことを意味します。また、ハッシュキー( '" $ name [$ _] "')を不必要に引用しているところもあります。それは人々を混乱させるでしょう。 –

2

何かが動作するはずです:入力を消費するコードの

for (keys %myHash) {...} 
+0

通常、あなたのようなCスタイルの 'for'ループを(私の意見では)' foreach'ループを理解しやすいものに置き換えることができます。この場合、 '$ i(0 .. $#name)'が –

+0

@DaveCrossになります。しかし、SOの回答では、私はより普遍的な/言語に依存しないため、古典的な "for"を好む傾向があります。しかし、私自身のコードでは、何かに行く:) – AntonH

+2

私はどのような構成を好むコードを読みやすくすることが好きです。それはまれにCスタイルのループです。私はそれを使用するときにオフ・バイ・ワンのエラーを作るのは非常に簡単すぎることがわかります。 –

6

もっとPerl的ビット:

my %myHash =(); 
for (my $i=0 ; $i<$#name ; $i++) { 
    $myHash{$name[$i]} += $cost[$i]; 
} 

を次に、あなただけの総コストを得るために配列をループしてい:

..ソースデータは生きていないためです。

+0

もっと知るほど私はperlについて知っていることが少なくなります。完璧な答え。 – AbhiNickz

+1

@AbhiNickzは、データ構造を反復処理するときにデータ構造を変更するのは危険なことに気付くだけです。 – stevieb

4

一部map策略:個人的に

my %hash; 
%hash = map {$name[$_] => $hash{$name[$_]} += $cost[$_]} 0..$#name; 

それは見ることがはるかに簡単だとして、私は、しかしfor()またはwhile()ループ溶液でいいよ一目で起こっていること。