#!/usr/local/bin/perl -w use strict; my %installed; my %updates; # __DATA__ juggling below is just a kludge to simulate list files while () { my $target=$.>5?\%updates:\%installed; # Regex works on your limited sample, but is quite weak. /(.*?)-(\d.*)/; $target->{$1}=$2; } foreach my $package (keys %updates) { delete $updates{$package} unless (exists $installed{$package} && ($installed{$package} ne $updates{$package})); } print "Packages to update:"; print join "-", ($_,$updates{$_}), print "\n" for keys %updates; __DATA__ zip-2.3.1-14 xpdf-1.01-8 ggv-1.99.8-2 libpng-devel-1.2.2-8 xvattr-1.3-ogle1 WindowMaker-0.80.1-5 lynx-2.8.5-7.1 xpdf-1.01-10 ggv-1.99.9-5 xvattr-1.4-ogle1 libpng-devel-1.2.2-9 __END__ Packages to update: ggv-1.99.9-5-1 xvattr-1.4-ogle1-1 xpdf-1.01-10-1 libpng-devel-1.2.2-9-1