- 论坛徽章:
- 6
|
来一发 - #!perl
- use strict;
- use warnings;
- use diagnostics;
- use List::Util qw{max min};
- sub main;
- sub load_a_data;
- sub find_the_nearest;
- main;
- sub main {
- my $a_data_href = load_a_data();
- my $max = max keys %{$a_data_href};
- my $min = min keys %{$a_data_href};
- # read file B
- my $file = 'B.txt';
- open my $fh, '<', $file or die "Unable to open file $file:$!$/";
- while (defined (my $line = readline $fh) ) {
- # body...
- chomp $line;
- $line =~ s{^\s+ | \s+$}{}gmix;
- next if not $line;
- my ($word, $num) = split /\s+/, $line;
- my $words_aref = find_the_nearest($num, $a_data_href, $max, $min);
- print "$word\t@{$words_aref}$/";
-
- }
- close $fh;
- }
- sub load_a_data {
- # body...
- my %data = ();
- my $file = 'A.txt';
- open my $fh, '<', $file or die "Unable to open file $file:$!$/";
- while (defined (my $line = readline $fh) ) {
- # body...
- chomp $line;
- $line =~ s{^\s+ | \s+$}{}gmix;
- next if not $line;
- my ($word, $num) = split /\s+/, $line;
- push @{ $data{$num} }, $word;
- }
- close $fh;
- return \%data;
- }
- sub find_the_nearest {
- # body...
- my ($num, $a_data_href, $max, $min) = @_;
- my $words_aref = [];
- if (exists $a_data_href->{$num}) {
- # if exactly matched
- $words_aref = $a_data_href->{$num};
- }
- else {
- if ($num < $min) {
- # only need to look for numbers greater than $num
- my $new_num = $num;
- while (1) {
- $new_num += 1;
- if (exists $a_data_href->{$new_num}) {
- $words_aref = $a_data_href->{$new_num};
- last;
- }
- }
- }
- elsif ($num > $max){
- # only need to look for numbers smaller than $num
- my $new_num = $num;
- while (1) {
- $new_num -= 1;
- if (exists $a_data_href->{$new_num}) {
- $words_aref = $a_data_href->{$new_num};
- last;
- }
- }
- }
- else {
- # look for numbers both way
- my $new_num_bigger = $num;
- my $new_num_smaller = $num;
- while (1) {
- $new_num_bigger += 1;
- $new_num_smaller -= 1;
- my @words = ();
- if (exists $a_data_href->{$new_num_bigger}) {
- push @words, @{ $a_data_href->{$new_num_bigger} };
- }
- if (exists $a_data_href->{$new_num_smaller}) {
- push @words, @{ $a_data_href->{$new_num_smaller} };
- }
- if (scalar @words) {
- $words_aref = \@words;
- last;
- }
- }
- }
- }
- return $words_aref;
- }
- __END__
复制代码 |
评分
-
查看全部评分
|