- 论坛徽章:
- 307
|
本帖最后由 sunzhiguolu 于 2015-10-20 17:09 编辑
回复 40# xiuwosuoai
试下:- #!/usr/bin/perl -w
- use strict;
- my (%h_dat, $last_name);
- my $reg_distance = "(?<pre>[^:]+:)(?<n1>[0-9]+)-(?<n2>[0-9]+)";
- while (<>){
- chomp;
- my ($name, $distance) = split;
- unless (exists $h_dat{$name}){
- print "$last_name $h_dat{$last_name}\n" if (defined $last_name);
- $h_dat{$name} = $distance;
- }else{
- my ($n1, $n2) = ($+{n1}, $+{n2}) if ($distance =~ m{\A$reg_distance\z});
- my $_distance = $h_dat{$name};
- my ($_n1, $_n2) = ($+{n1}, $+{n2}) if ($_distance =~ m{\A$reg_distance\z});
- if ($n1 >= $_n1 and $n1<= $_n2){
- $h_dat{$name} = $+{pre} . $_n1 . '-' . ($n2 > $_n2 ? $n2 : $_n2);
- $last_name = $name;
- print "$last_name $h_dat{$last_name}\n" if (eof);
- }else{
- print "$last_name $h_dat{$last_name}\n";
- delete $h_dat{$last_name};
- $h_dat{$name} = $distance;
- }
- }
- }
复制代码 不足的地方:代码不能对乱序的记录行进行处理.
如果希望进行乱序处理, 可以一次性将满足条件的行记录全部加载到哈希中, 最后再进行打印输出.
请大家给我解惑的地方, 如下:
此代码文件在处理最后一条满足条件的行记录时使用了 eof 函数, 我感觉比较生硬.
如何进行修改程序逻辑, 使得代码判断逻辑更加自然, 顺畅还请大家给予指点.
在此先谢谢大家的帮助及支持... |
|