Hello...
I have thought about this one and tried various code changes but cannot get
what I want.
My problem: mismatched UIDs in password files.
My solution:
#1 store passwd files in a globbed array
#2 create array reference from globbed array
#3 open array ref, create hash with more than one value per key. Keys are
regexps from filenames
#4 read in every line of passwd files from reference. Values in hash need to be
passwd entries
For example: key => servernames.platform (dubhpr01.hpux)
values => filelds from passwd file (name,uid,gid,comments)
#5 Once hash is built, traverse through searching for usernames that have
unlike UIDs from all files, then print these to an xls using
SpreadSheet::WriteExcel.
In my code I have completed 1,2 and 3. Started 4 but I am printing the array
reference address as opposed to printing the actual values. What am I doing
wrong and any tips would be nice?
_OUTPUT_
KEY dubhst14.hpux
ELEMENTS /home/dbsmith/passwd.dubhst14.hpux
DUB VALUES root
KEY dubhdv05.hpux
ELEMENTS /home/dbsmith/passwd.dubhdv05.hpux
DUB VALUES root
dubhst14.hpux => ARRAY(0x4002b0f8)
dubhdv05.hpux => ARRAY(0x4059c9a4)
dubhadm3.hpux => ARRAY(0x4059c8f0)
dwhetls2.hpux => ARRAY(0x4002c164)
dubhadm1.hpux => ARRAY(0x4059c8a8)
oftappp1.hpux => ARRAY(0x405a2084)
dubhpr28.hpux => ARRAY(0x4002e1bc)
cic2.hpux => ARRAY(0x4059c6f8)
#!/usr/bin/perl
##-- Initialize environment --##
use strict;
use warnings;
use diagnostics;
use Spreadsheet::WriteExcel;
#use Data::Dumper;
$ENV{"PATH"} = qq(/usr/bin:/bin:/home/dbsmith:/home/dbsmith/McGaw);
delete @ENV{qw (IFS CDPATH ENV KSH_ENV BASH_ENV)};
##-- Central DIE routine --##
open (LOG, ">>/tmp/uid_ck.log") or warn "uid_ck.log did not open $!";
my $overide = $SIG{__DIE__}; ## get error handler currently assigned 2 die
$SIG{__DIE__} = sub {
my $error = shift; ## error now holds the mesg passed to die
$overide->($error) if ( ref $overide );
print LOG ($error);
};
##-- BEGIN MAIN --##
my @dublinaray = glob("/home/dbsmith/passwd.*");
my $dublin_aref = [EMAIL PROTECTED];
my @mcgawaray = glob("/home/dbsmith/McGaw/passwd.*");
my $mcgaw_aref = [EMAIL PROTECTED];
my (%dublin_hosts,%mcgaw_hosts) = ();
my ($dub_key,$dub_values,$mcg_key,$mcg_values);
parse_file();
sub parse_file {
foreach my $element ( @{$dublin_aref} ) {
{ local *FILE;
open (FILE, "+<$element") or die "dublin reference did not open: $!";
local $/ = undef;
($dub_key) = $element =~ m|\.(\w+\.\w+)\z|i;
($dub_values) = split /:/, <FILE> ;
push ( @{$dublin_hosts{$dub_key}}, $dub_values );
print "KEY\t",$dub_key,"\n\n";
print "ELEMENTS\t",$element,"\n\n";
print "DUB VALUES\t",$dub_values,"\n\n";
}
}
while ( ($dub_key,$dub_values) = each %dublin_hosts ) {
print "$dub_key => $dub_values\n";
}
#foreach my $host (sort keys %dublin_hosts) {
# print "$host: @{$dublin_hosts{$dub_key}}\n";
#}
#foreach my $element2 ( @{$mcgaw_aref} ) {
# { local *FILE2;
# open (FILE2, "+<$element2") or die "mcgaw reference did not open: $!";
# local $/ = undef;
# ($mcg_key) = $element2 =~ m|\.(\w+\.\w+)\z|i;
# push (@{$mcgaw_hosts{$mcg_key}}, $mcg_values );
# print "\n$element2\n\n";
# print ;
# }
#}
} ##-- END SUB --##
__________________________________________________
I looked in the cookbook and as I tried to implement is below. Am I on the
right road?
thank you
5.7. Hashes with Multiple Values Per Key Problem You want to store more
than one value for each key.
Solution Store an array reference in $hash{$key}, and put the values into
that array.
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com