11966


2つのファイルをハッシュに格納して重複するキーを作成してからマージしたいのですが、出力ファイルのようにデリファレンスできていないデータが表示されます。どうすれば、ファイルにデータが正常通り出力されますか？

出力したい内容：キーを1項目目として、重複するキーを削除して2項目、3項目目を足し合わせます。  
4項目目は最新の月を表示したいです。5項目目はそのまま出力します。

[code]

    ・入力ファイル01
    きゅうり,7800,40,20150629,a
    牛乳,10000,24,20150629,b
    水,5000,48,2015029,b
    にんじん,6500,30,20150629,a
    きゅうり,4800,20,20150628,a
    
    
    ・入力ファイル02
    きゅうり,7800,40,20150630,a
    にんじん,6500,30,20150630,a
    牛乳,5000,12,20150630,b
    水,2500,24,20150630,b
    水,2500,24,20150627,b
    にんじん,3500,15,20150630,a
    
    
    ・出力ファイル01
    きゅうりARRAY(0x204bbf0)
    牛乳ARRAY(0x204bd70)きゅうりARRAY(0x204bbf0)
    水ARRAY(0x204bfc8)牛乳ARRAY(0x204bd70)きゅうりARRAY(0x204bbf0)
    水ARRAY(0x204bfc8)牛乳ARRAY(0x204bd70)にんじんARRAY(0x55a1a8)きゅうりARRAY(0x204bbf0)
    水ARRAY(0x204bfc8)牛乳ARRAY(0x204bd70)にんじんARRAY(0x55a1a8)きゅうりARRAY(0x204be90)
    
    
    ・出力ファイル02
    きゅうりARRAY(0x204bed8)
    にんじんARRAY(0x561e08)きゅうりARRAY(0x204bed8)
    牛乳ARRAY(0x482d28)にんじんARRAY(0x561e08)きゅうりARRAY(0x204bed8)
    水ARRAY(0x561dc0)牛乳ARRAY(0x482d28)にんじんARRAY(0x561e08)きゅうりARRAY(0x204bed8)
    水ARRAY(0x204bcb0)牛乳ARRAY(0x482d28)にんじんARRAY(0x561e08)きゅうりARRAY(0x204bed8)
    水ARRAY(0x204bcb0)牛乳ARRAY(0x482d28)にんじんARRAY(0x561dc0)きゅうりARRAY(0x204bed8)
    
    
    use strict;
    use warnings;    
    
    # 処理開始
    my $input_FILE = "sales.txt";
    my $input_FILE_2 = "sales_2.txt";
    
    my $output_FILE = $input_FILE.".cyoufuku";
    my $output_FILE_2 = $input_FILE_2.".cyoufuku";
    
    cyofuku_CHAECK($input_FILE, $output_FILE);
    cyofuku_CHAECK($input_FILE_2, $output_FILE_2);
    
    sub cyofuku_CHAECK
    {
    my $f_input         =   shift;  #--- 入力ファイル名
    my $f_output        =   shift;  #--- 出力ファイル名
    
    # 変数定義
    my $rec         = "";
    my %data        = ();
    
    #### ファイルオープン ####
    open my $fh_in ,    "<:encoding(utf8)"      ,$f_input       or die;
    open my $fh_out ,   ">:encoding(utf8)"      ,$f_output      or die;
    
    #### [処理内容記述] ####
    while($rec = <$fh_in>){
    
        my @InRecord        = ();
    
        chomp $rec;
    
        @InRecord = split(/,/,$rec,-1);
    
        my $key = $InRecord[0];
    
        $data{$key} = [ \@InRecord ];   
    
        print $fh_out %data,"\n";
    }
    
    return 1;
    
[/code]

}


CC BY-SA 3.0
2015-07-01T07:01:15.107
11925
2015-07-02T12:30:16.587
9088
question
perl
perlのハッシュで重複するキーの削除と足し合わせ


書き方は色々あると思いますが、一例として次の様な感じ。

[code]

    &cyofuku_CHECK($input_FILE, $output_FILE);
    &cyofuku_CHECK($input_FILE_2, $output_FILE_2);
    
    sub cyofuku_CHECK($$){
        my $f_input  = shift;  #--- 入力ファイル名
        my $f_output = shift;  #--- 出力ファイル名
    
        my %data = ();
    
        open my $fh_in , "<:encoding(utf8)", $f_input  or die;
        open my $fh_out, ">:encoding(utf8)", $f_output or die;
    
        while(<$fh_in>){
            chomp;
    
            my ($key, @InRecord) = split(/,/, $_, -1);
            if($data{$key}){ #既にキーが存在する
                $data{$key}->[0] += $InRecord[0];
                $data{$key}->[1] += $InRecord[1];
                $data{$key}->[2]  = $InRecord[2] if $data{$key}->[2] < $InRecord[2];
                $data{$key}->[3]  = $InRecord[3]; #単に上書き
            } else { #まだ同じキーが存在しない
                $data{$key} = \@InRecord;
            }
        }
        foreach my $key (keys %data){
            print $fh_out join(',', $key, @{$data{$key}}),"\n";#連結して書きだし
        }
        close $fh_in;
        close $fh_out;
        return 1;
    }
    
[/code]


CC BY-SA 3.0
2015-07-02T12:30:16.587
11966
2015-07-02T12:30:16.587
5044
11925
answer