Вы можете использовать:
my %iniFiles = ();
while (<>) {
my ($ini, $vers) = split / +/, $_;
if (exists $iniFiles{$ini}) {
$iniFiles{$ini} = $vers if ($iniFiles{$ini} < $vers);
} else { $iniFiles{$ini} = $vers }
}
while (my ($k,$v) = each %iniFiles) { print "$k $v\n" }
Или, если важен порядок ввода:
my @inis = ();
my %iniFiles = ();
while (<>) {
my ($ini, $vers) = split / +/, $_;
if (exists $iniFiles{$ini}) {
$iniFiles{$ini} = $vers if ($iniFiles{$ini} < $vers);
} else { push @inis, $ini; $iniFiles{$ini} = $vers }
}
foreach (@inis) { print "$_ $iniFiles{$_}\n" }