#!/usr/bin/perl -w use strict; use constant EXPENSE_FILE => 'expense.dat'; use constant EXPENSE_REPORT => 'final_expense.txt'; use constant FIELDS_PER_RECORD => 4; use constant REPORT_HEADER => "Department,Total\n"; my $expenses = get_expense_data( EXPENSE_FILE ); my $deptTotals = sum_expenses_by_department($expenses, FIELDS_PER_RECORD); write_report( $deptTotals, EXPENSE_REPORT, REPORT_HEADER ); sub get_expense_data { my $file = shift; open IN_FILE, "<", $file or die "Cannot open $file for reading: $!"; my @expenses = ; close IN_FILE; return \@expenses; } sub sum_expenses_by_department { my ( $expenses, $fields_per_record ) = @_; my %deptTotals; foreach my $expense ( @$expenses ) { my %record; my @fields = qw/ dept empID amount desc /; @record{ @fields } = split /,/, $expense, $fields_per_record; if ( ! exists $deptTotals{ $record{ dept } } ) { $deptTotals{ $record{ dept } } = 0; } $deptTotals{ $record{ dept } } += $record{ amount }; } return \%deptTotals; } sub write_report { my ( $report_data, $file, $header ) = @_; open OUT_FILE, ">", $file or die "Cannot open $file for writing: $!"; print OUT_FILE $header; foreach ( sort keys %$report_data ) { print OUT_FILE "$dept,$report_data->{ $_ }\n"; } close OUT_FILE; }