Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: hash array

by liverpole (Monsignor)
on Nov 03, 2010 at 18:01 UTC ( #869285=note: print w/ replies, xml ) Need Help??


in reply to hash array

Hi roadtest,

You have a number of issues, all of which are very minor.

For one thing, note that @owner and %owner are separate things (the first is an array, the second a hash), and you don't ever declare the hash:

my %owner = ( );

You should also (though you didn't ask about this) check the return value from open, otherwise (as I did) you could get a confusing error message like "readline() on closed filehandle FILE at C:\test\x.pl line 10".  Here's a simple fix for that:
open (FILE,"cron.log") or die "Can't open 'cron.log -- here's why: + $!\n";
but even better than that is to use the 3-arg open statement instead of the 2-arg version, which (along with lexical filehandles) is considered better programming practice:
use IO::File; my $fh = new IO::File("cron.log", "r") or die "Can't open 'cron.log' ( +$!)\n"; # Now use $fh in place of FILE ...

It might be better to break next if (split /[ ]+/)[1] !~ /oracle|sybase/ ; into multiple lines:

my @split = split /[ ]+/; my $split1 = $split[1] || ""; next if ($split1 !~ /oracle|sybase/)

so that when your input file doesn't contain what you expect, or something else goes wrong, you can debug the values in @split, or the value of $split1 (which might be undefined; hence my converting it to "").

You don't need to do (keys %{$owner} (which you've done in two or three places), it suffices to do (keys %owner) to get the keys of the hash.

Here's a version that runs without warnings:

#!/usr/bin/perl use strict; use warnings; use Date::Manip; use IO::File; my @owner = qw/oracle sybase/; my %owner = ( ); my $fh = new IO::File("cron.log") or die "Can't open 'cron.log' ($!)\n +"; while(<$fh>) { chomp; my @split = split /[ ]+/; my $split1 = $split[1] || ""; next if ($split1 !~ /oracle|sybase/); my ($mode,$owner,$job_id,undef,undef,undef,undef,$timestamp,undef) + = split /[ ]+/; #get same jobID finish timestamp and calculate difference, #then save back ${owner}{$job_id} = DateCalc (${$owner}{$job_id},$timestamp) if ($mode=~ /^>/); } close $fh; foreach my $owner(@owner) { foreach (keys %owner) { print "$owner - JobID:$_ - RunTime:${$owner}{$_}\n"; }; }

Now you can focus on whether the program is working as you wish...


s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/


Comment on Re: hash array
Select or Download Code
Replies are listed 'Best First'.
Re^2: hash array
by roadtest (Sexton) on Nov 05, 2010 at 18:28 UTC
    Thanks for pointing out my bad habit. Points are taken.:-)

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://869285]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (13)
As of 2015-07-29 22:02 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (269 votes), past polls