免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4064 | 回复: 11
打印 上一主题 下一主题

已经解决.结贴 脚本 Perl - 我的代码逻辑哪里错了? (匿名数组) [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-17 15:30 |只看该作者 |倒序浏览
本帖最后由 sunzhiguolu 于 2015-09-29 21:53 编辑

文本内容如下:

  1. Number       start    end         name
  2. -------------------------------------------------------------
  3. NO.1          1       10          wf
  4. NO.1          11      22          wf
  5. NO.1          29      38          cz
  6. NO.1          39      51          cz
  7. NO.1          52      60          cz
  8. NO.2          2       9           gx
  9. NO.2          10      22          gx
  10. NO.2          23      40          gx
复制代码
希望根据 name 字段的取值去除重复行. 去重后 start 字段的起始值保持不变, end 字段保持最大值. 最终实现效果如下:

  1. Number       start    end         name
  2. -------------------------------------------------------------
  3. NO.1          1       22          wf
  4. NO.1          29      60          cz
  5. NO.1          2       40          gx
复制代码
#以下是一些变量的注释: (希望没有给您读代码造成困扰 ^_^)
#哈希变量 %record_list 保存最终结果, 数组 @record 存储每一条记录
#变量 $k, $next_number 分别存储 name, end 字段的值

  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;

  5. @ARGV or die "Give me a file!\n";
  6. my (%record_list, @record, $k, $next_number);
  7. while(<>){
  8.    chomp;
  9.    @record = split /\s+/;
  10.    if (!%record_list){
  11.       $record_list{$record[-1]} = \@record;   #等号右面应改为 [@record];
  12.    }else{
  13.          ($next_number, $k) = ($record[-2], $record[-1]);
  14.       if (exists $record_list{$k}){
  15.          $record_list{$k}[-2] = $next_number;
  16.       }else{
  17.          $record_list{$k} = \@record;         #这里同上
  18.       }
  19.    }
  20. }

  21. #结果测试:
  22. foreach my $key (keys %record_list){
  23.    my ($id, $begin_num, $end_num, $name) = (
  24.    $record_list{$key}[0],
  25.    $record_list{$key}[1],
  26.    $record_list{$key}[2],
  27.    $record_list{$key}[3]);

  28.    say "$id, $begin_num, $end_num, $name";
  29. }
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2015-09-17 15:30 |只看该作者
以下是我的输出结果:

  1. NO.2, 23, 40, gx
  2. NO.2, 23, 40, gx
  3. NO.2, 23, 40, gx
复制代码
一点都不对! 我各个地方都进行了测试感觉数据挺正确的. 就是输出结果的时候就傻眼!

论坛徽章:
0
3 [报告]
发表于 2015-09-17 15:38 |只看该作者
$record_list{$record[-1]} = \@record;
$record_list{$k} = \@record;

\@record ==> [@record]

评分

参与人数 1信誉积分 +5 收起 理由
sunzhiguolu + 5 这么忍心就走了吗? 我还在傻等... 多谢您的.

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2015-09-17 15:42 |只看该作者
本帖最后由 sunzhiguolu 于 2015-09-17 15:55 编辑

回复 3# ba_du_co
1.> $record_list{$record[-1]} = \@record;
2.> $record_list{$k} = \@record;

3.> \@record ==> [@record]

比较笨! 没看懂, 啥意思?

1.> 如果哈希 %record_list 为空, 则用数组元素的最后一个字段作为键, 并将数组的引用作为值进行存储
2.> 如果哈希 %record_list 中不包含指定键的话, ...

等下... 我好像明白您说的了... 稍后回来!

白高兴一场...

论坛徽章:
0
5 [报告]
发表于 2015-09-17 15:47 |只看该作者
回复 4# sunzhiguolu
     \@record
改成   
      [@record]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
6 [报告]
发表于 2015-09-17 15:51 |只看该作者
本帖最后由 sunzhiguolu 于 2015-09-17 15:53 编辑

回复 5# ba_du_co
[@record]

我是 Perl 语言新手, 请问 [] 一对放括号, 在此处表示啥意思?
或者您告诉我这是一个什么东西, 我自行查找资料也行.


   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2015-09-17 15:58 |只看该作者
本帖最后由 sunzhiguolu 于 2015-09-17 15:59 编辑

回复 5# ba_du_co
方才试了一下, 果真一点问题都没有! 还请您给予指点...
\@record 与 [@record] 之间的区别是啥?

   

论坛徽章:
0
8 [报告]
发表于 2015-09-17 16:02 |只看该作者
回复 6# sunzhiguolu
array ref
\@a ==> same address
[@a] ==> different address

   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2015-09-17 16:04 |只看该作者
回复 8# ba_du_co
多谢多谢...

   

论坛徽章:
0
10 [报告]
发表于 2016-10-03 23:29 |只看该作者
回复 1# sunzhiguolu

您的代码,有的地方没看懂,
if (!%record_list)   这句是判断哈希是否定义吗?不是很理解,在最开始已经声明了哈希,为什么在此还要判断一次呢?

初学perl,望指教!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP