免费注册 查看新帖 |

Chinaunix

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

perl for循环求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-25 21:13 |只看该作者 |倒序浏览
work.txt
1        00110010
4        00110010
5        00001000
8        00011000
10        00100010
16        00000110
25        00010000
29        01110010
31        00110000
37        11100010
38        00111000
41        10000010
45        01100000
49        10000001
50        01001000
52        11111010
55        10000110
57        11111010
59        10000010
60        10000000
61        11000000
67        00000000

output.txt
0        3
1        2
2        2
3        3
4        3
5        4
6        3



自己写的程序
open IN,"work.txt";

my $num;
for (my $i=0; ;i+=10)   ####如果加上$i <=***,这个循环才能终止吗?
{       
        my $temp="";
        while (<IN>)
        {
                chomp;
                my @a=split;
                if ($a[0] >= $i && $a[0] < $i + 10)
                {if ($a[1] ne $temp){$num++;}}
        }
        print "$i\t$num\n";
}


####
$num是,在满足$a[0] >= $i && $a[0] < $i + 10的前提下,第二列字符串去重复的个数









论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
2 [报告]
发表于 2014-08-25 22:26 |只看该作者
貌似结果跟你有点出入~
  1. #!/usr/bin/perl -w

  2. open IN,"< work.txt" || die "$!";
  3. my (%h,%new);
  4. while(<IN>){
  5.                 chomp;
  6.                 my @tmp = split;
  7.                 my $a = int($tmp[0]/10);
  8.                 push @{$h{$a}},$tmp[1];
  9. }
  10. close IN;
  11. for my $key (sort{$a <=> $b}keys %h){
  12.         my $num = grep { ++$new{$_} < 2 } @{$h{$key}};
  13.         print "$key\t$num\n";
  14. }
复制代码

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
3 [报告]
发表于 2014-08-26 09:04 |只看该作者
没有结束条件的for,不就是死循环么.

论坛徽章:
1
金牛座
日期:2014-08-10 21:59:41
4 [报告]
发表于 2014-08-26 19:28 |只看该作者
你问题没有说明清楚,满足$a[0] >= $i && $a[0] < $i + 10的前提下,第二列字符串去重复的个数
而你代码中 $temp是在 $i 变动时重置,这样第38个要跟41比吗?
而且LZ条件if ($a[0] >= $i && $a[0] < $i + 10) {if ($a[1] ne $temp){$num++;}}
这样第10 20 30 … 都不会去比对
我照着代码意思练习了一下,代码中不会比较38 与41这种跨过10的,并且比较的范围区间是0-9  10-19  20-29 ……

  1. my ($num, $loop, $tmp) = (undef, 0, '');
  2. open IN, 'work.txt';
  3. while(<IN>){
  4.         chomp $_;
  5.         my @data = split;
  6.         $tmp = '' if $data[0] > $loop * 10 + 10;
  7.         $loop++ if $data[0] > $loop * 10 + 10;
  8.         $num->{$loop} ++ if $tmp ne $data[1];
  9.         $tmp = $data[1];
  10. }
  11. close (IN);
  12. open W, '>output.txt';
  13. for(sort keys %$num){
  14.         print W "$_\t", $num->{$_} - 1, "\n";
  15. }
  16. close(W);
复制代码

论坛徽章:
0
5 [报告]
发表于 2014-08-26 22:26 |只看该作者
是我自己肉眼算错了,你的代码是对的。多谢!
回复 2# huang6894


   

论坛徽章:
0
6 [报告]
发表于 2014-08-26 22:27 |只看该作者
嗯,第38个不需要跟第41个比

回复 4# dav_


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP