#! /usr/bin/perl sub make_key_hash { my ($filename) = shift; open (F, $filename) || die "Cannot open $filename: $!"; my ($hr) = {}; my ($i, $count, @line); while () { next if /^#/; chomp; $count = 0; $count=s/' '/'s'/g; # a kludge to handle space @_ = split; next unless $_[1] =~ /'.'/; if ($count != 0) { foreach (@_) { $_ =~ s/'s'/' '/; } } for ($i = 5; $i < 9; $i++) { push @{ $hr->{$_[1]} }, $_[$i]; } } close F; return $hr; } sub print_key_hash { my ($hr) = shift; my ($k); foreach $k (sort keys %$hr) { print $k, ' ::-> '; foreach ( @{ $hr->{$k} } ) { print $_, ' '; } print "\n"; } } sub merge_key_map { my ($filename, $hr) = @_; open(F, $filename) || die "Cannot open $filename: $!"; my ($i, $count); format STDOUT = @|||@||||||@||||||@||||||@||||||@||||||@||||||@||||||@||||||@>>> @line . while () { if (/^#/) { print; next; } chomp; $count = s/' '/'s'/g; @_ = split; unless ($_[1] =~ /'.'/) { print; print "\n"; next; } if ($count != 0) { foreach (@_) { $_ =~ s/'s'/' '/; } } unless (defined $hr->{$_[1]}) { print; print "\n"; next } @line = (); for ($i = 0; $i < 5 ; $i++) { push @line, $_[$i]; } for ($i = 5; $i < 9; $i++) { push @line, $hr->{$_[1]}->[$i-5]; } for ($i = 9; $i < @_; $i++) { push @line, $_[$i]; } write; # print "\n"; } close F; } my ($hr) = make_key_hash("us.emacs.kbd"); # print_key_hash($hr); merge_key_map("us.dvorak.kbd", $hr);