You can do that pretty conveniently. First set up the unchanging country list as an array (not with qw() since some countries have more than one word in the name):
my @countries = (
'Algeria',
'Argentina',
'Zaire',
);
Now prepare to read the data file,
my %HoH;
open INFILE, '< /path/to/datafile.txt' or die $!;
The file contains our top level keys with colon as a delimiter, and the second level values in order corresponding to the country array (In my opinion that is a weakness of the design, a new country forming will wreck things for you). We will split each line first on colon to get the top key, then we'll do magic split on space to provide the values. We can get an efficient and compact assignment using a hash slice.
while (<INFILE>) {
( my $quarter, $_) = split ':';
@{$HoH{$quarter}}{@countries} = split " "; # repaired typo, ++petr
+al
}
Both lines in that read loop are a little unusual.
my usually is seen outside the parens, but only $quarter is to be lexical. The rat's nest of curlies applies @ to a hash reference, setting up the slice.
close INFILE or die $!;
All done!
After Compline,
Zaxo