Mathew Snyder wrote:
I'm passing two hash references into a subroutine. One hash is in the format of $dept{$env}{$user}. This contains an amount of time spent by each user on a customer ($env). The second hash is in the format of $ticCount{$env}{$user}{$ticID}. This contains a running count of how many times a user worked on ticket '$ticID' which belongs to customer '$env'. I won't be using that number though. What I need is the number of tickets worked on so I simply use 'scalar keys' on this hash. The problem I'm encountering though, is that I'm passing the hashes into my subroutine as references. When I get to the statement that gets the key count I get an error: "Can't use string ("2") as a HASH ref while "strict refs" in use at user_timesheet.pl line 63." Presumably, 2 is the number of keys at $ticCount{$env}{$user}{$ticID}. sub average { my ($users, $count) = @_; my %userAvg; foreach my $env (keys %$count) { foreach my $user (keys %{ $count->{$env} }) { foreach my $ticID (keys %{ $count->{$env}->{$user} }) { my $ticCount = scalar keys %{$count->{$env}->{$user}->{$ticID}}; my @meantemp; my @meantime; my @endtime; my $temp = $users->{$env}->{$user}; @meantemp = split /\./, ($temp / $ticCount); # If the time divided by the number of tickets has a decimal # value round up if that value is greater than # 0.5. This will give an even number of minutes to figure # out the mean time with. if ($meantemp[1]) { if ($meantemp[1] >= 5) { $meantemp[0]++; } } @meantime = split /\./, ($meantemp[0] / 60); $endtime[0] = $meantime[0]; $endtime[1] = $meantemp[0] % 60; $userAvg{$env}{$user} = sprintf '%d:%02d', @endtime[0,1]; } } } return %userAvg; } I've run this in the debugger and when I get to the line which assigns $ticCount I try to print it out and it's just blank. If I keep hitting enter it just returns to a blank line. I get the error when I continue to the next line with 'c'.
Hi Mathew First of all, you can replace $count->{$env}->{$user}->{$ticID} with $count->{$env}{$user}{$ticID} and Perl will infer the indirection. It makes for neater code. The reason for your problem is that you've gone too far down in the hash structure. You said that $count->{$env}{$user}{$ticID} is a "count of how many times a user worked on [a] ticket", in this case 2. so you're then trying to do my $ticCount = scalar keys %{2}; which is failing. Finally, you can round more efficiently by using int(x + 0.5). I suggest something like this (untested): sub average { my ($users, $count) = @_; my %userAvg; foreach my $env (keys %$count) { foreach my $user (keys %{ $count->{$env} }) { my $ticCount = scalar keys %{$count->{$env}{$user}}; my $time = $users->{$env}{$user}; my $meantime = int($time / $ticCount + 0.5); $userAvg{$env}{$user} = sprintf '%d:%02d', int($meantime / 60), $meantime % 60; } } return %userAvg; } HTH, Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/