perlquestion
sdslrn123
Sorry another update:
Is there a way to calculate the total number of terms altogether. I want this information to convey the information as a percentage.
<code>
print "$member can be found " . scalar(@{$family{$member}}) / ? . ": "
</code>
<code>
#!/usr/bin/perl
use Data::Dumper; # only for teaching purpose
$Data::Dumper::Indent = 1; # dito :-)
while(<DATA>) {
chop;
my($familyname,$memberstring) = split /\s--\s/,$_;
my @members = split /, /,$memberstring;
# tell each member that it's got a new family
foreach my $member(@members) {
push(@{$family{$member}},$familyname);
}
}
print Dumper(\%family); # show the data structure in %family
# now output a list of members with their families
foreach my $member(sort keys %family) {
print "$member can be found " . scalar(@{$family{$member}}) . ": "
. join(" ", @{$family{$member}}) . "\n";
}
</code>
Thank You. Genius. Some heavy PERLDOC reading tonight!!
Updated. Sorry about confusion with variable names.
Basically my data is subject to change but will follow a format as follows where I will have a unique "Family Name" followed by "--" followed by various "family members". The contents of the data are unknown to me apart from the format. Data is a text file.
Could consist of as follows:
<code>
FLINTSTONES=BARNEY, FRED, WILMA
JETSONS=MAX, TONY, WILMA
SIMPSONS=LISA, BARNEY, WILMA, HOMER
ALCATRAZ=ELIJAH, MAX, WILMA
</code>
I know I can grab this into an array called @Dopli. And split each line $unix at "--" into an array @trainer Is there a way of pushing each array into a hash using $trainer[0] and $trainer[1].
<code>
sub nice_list {
return '' if @_ == 0;
return shift if @_ == 1;
my $last = pop;
return join(', ', @_) . " and $last";
}
my $line;
my @data;
my @family;
my @members;
foreach $line (@data){
@family = split ('=', $line);
@members = split (',', $family[1]);
my %is_eaten_by = (
$family[0] => [ (@members) ],
);
foreach my $fruit (keys %is_eaten_by) {
my $eaters = $is_eaten_by{$fruit};
my $num_eaters = @$eaters;
print("$num_eaters ${fruit}: ",
(@$eaters), "\n");
}
}
</code>
Ultimately I am looking to print:
<code>
BARNEY can be found 2: FLINTSTONES SIMPSONS
FRED can be found 1: FLINTSTONES
WILMA can be found 4: FLINTSTONES JETSONS SIMPSONS ALCATRAZ
MAX can be found 2: JETSONS ALCATRAZ
and so forth...
</code>
At the moment am just getting what seems the number of terms of each array related to the key.
Thanks for any kind of help or advice.