2011-10-27 8 views
1

Perlを初めて使用しています。次のデータのユニークな数と合計を見つける必要があります。私はあなたの助けを求める。Perlを使用して一意の数と合計を出力するには

08/2009 I-111 300 
08/2009 I-112 400 
08/2009 I-113 500 
10/2009 I-200 1000 
10/2009 I-300 500 
11/2009 I-300 100 
11/2009 I-100 400 

だから私は、あなたが正確に何をしたいわからないこの

08/2009 3 1200 
10/2009 2 1500 
+3

どの部分に助けが必要ですか? –

+0

そして、このデータはどこですか?ファイル、DB?私たちが手伝ってくれるようもっと詳しい情報を加えてください。 – pcalcao

+1

11/2009に何が起こりましたか?それも出力されませんか? –

答えて

1

のように見つける必要があるが、これは大丈夫でしょうか?

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dump qw(dump); 

my %h; 
while(<DATA>) { 
    chomp; 
    my @el = split; 
    $h{$el[0]}{count}++; 
    $h{$el[0]}{sum} += $el[2]; 
} 
dump%h; 

__DATA__ 
08/2009 I-111 300 
08/2009 I-112 400 
08/2009 I-113 500 
10/2009 I-200 1000 
10/2009 I-300 500 
11/2009 I-300 100 
11/2009 I-100 400 

出力:List::MoreUtilsから

(
    "08/2009", 
    { count => 3, sum => 1200 }, 
    "11/2009", 
    { count => 2, sum => 500 }, 
    "10/2009", 
    { count => 2, sum => 1500 }, 
) 
+0

こんにちは、ありがとうございました。しかし、私のPerlコンパイラはData :: Dumpを見つけることができません。 – user1016594

+0

'cpan Data :: Dump'ですが、可視化のためだけに、' Data :: Dumper'を使うことができます。これはコアモジュールで、 'use Data :: Dumper; ...; printダンパー(\%h); ' –

2

uniqリストのユニークな要素を返す:

use List::MoreUtils 'uniq'; 
my @x = uniq 1, 1, 2, 2, 3, 5, 3, 4; # (1,2,3,5,4) 

スカラーコンテキストでリスト表現は、要素の数を返します。 List::Utilから

my @array = (5,6,7,8); 
my $a_count = @array;  # 4 

my %hash = ('x' => 1, 'y' => 2); 
my $h_count = keys %hash; # 2 

sumリストの要素を追加します。

use List::Util 'sum'; 
my @array = (1,2,3,4,5); 
print sum @array; # 15 
+0

申し訳ありません使用できませんList :: util他の方法で表示できますか? – user1016594

+0

'Scalar :: Util'はコアモジュールの1つなので、最初にあなたの質問に'宿題 'というタグを付けるのが他の方法です:) – yko

+2

モジュールはList :: Util(単数)とList :: MoreUtils '(複数形)前者は5.7.3でPerlコアに追加されました。後者はコア配布の**一部ではありません**。 'Scalar :: Util'は5.7.3のもう一つのコアモジュールですが、合計以外のものや独自の要素を見つけることができます。 – JRFerguson

0

日時:

use Data::Dumper; 
print Dumper \%h; 

をそれとも、ただ書くことができます::M42の答え、試す

while (my ($key, $values) = each %h) { 
    print "$key $values->{count} $values->{sum}\n"; 
} 
+0

awkを使っているなら、 'awk '{count [$ 1] ++; sum [$ 1] ++} END {for(value in count)} {print value、sum [value]、count [value ]}} 'data.txt' – flesk

0

通常、私は自由タイプのもののために私のプログラムを書く行いません。既にM42がそれをほとんど実行して以来、ここにはData::Dumpがありません:

#!/usr/bin/perl 
use strict; 
use warnings; 

my %h; 
while(<DATA>) { 
    chomp; 
    my @el = split; 
    $h{$el[0]}->{count}++; 
    $h{$el[0]}->{sum} += $el[2]; 
} 

foreach my $element (sort keys %h) { 
    printf "%-10.10s %-6.6s %4d\n", $element, 
    $h{$element}->{count}, $h{$element}->{sum}; 
} 
__DATA__ 
08/2009 I-111 300 
08/2009 I-112 400 
08/2009 I-113 500 
10/2009 I-200 1000 
10/2009 I-300 500 
11/2009 I-300 100 
11/2009 I-100 400 

今すぐlearn yourself some Perl

+0

こんにちは。私が働いているとき、私は次のように私の出力を得ています。これはbizaareです!私はSolaris unixを使用しています。 Ubunuでコードを実行すると、正しい値が得られました。私の出力は1/2009です。==========> 38821 01/2010 ==========> 32888 1/2209 ===> 3 01/2011 ==== ======> 27134 となるはず – user1016594

+0

@ user1016594あなたのUbuntuボックスとSolaris上のPerlのバージョンは何ですか?私のコードは5.xの後でPerlのほぼすべてのバージョンで動作するはずです。私はバージョン5.xから最初に導入されたことはありません。 perlバージョンを見つけるには 'perl -v'を実行します。 –

関連する問題