免费注册 查看新帖 |

Chinaunix

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

请问如何用哈希统计一个数组中某个词出现的次数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-04-21 23:41 |只看该作者 |倒序浏览
我编的是这样的

生成的数组是这样的

但是得出的结果竟然是这样的

请问哈希那里有什么问题吗?

论坛徽章:
0
2 [报告]
发表于 2015-04-22 00:22 |只看该作者
回复 1# 驴小兔


    if( $_ =~ /^\d+/ ) {
        push( @array, $_ )
你这里是把那个文件里以数字开头的一整行当作列表里面的一个元素放进去了,hash计数那里你打印以下那个$_就知道有问题了,你是想统计这一串数字中重复出现的次数??那个文件里面有很多行这样的数字??

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
3 [报告]
发表于 2015-04-22 01:12 |只看该作者
关于输入输出,有很好的模块 File::Slurp,省略了繁冗的文件句柄操作。

对于文件中的数字,可以按照空格拆分。如果要按照正则匹配。要用下面的表达式来匹配小数和整数:
  1. /\d(\.\d+)?/
复制代码
  1. #!perl

  2. use 5.016;
  3. use File::Slurp qw(read_file write_file);
  4. use YAML qw(Dump);
  5. use JSON qw(to_json from_json);

  6. my $text = read_file 'D:/CG_rate.txt';
  7. my @numbers = split /\s+/, $text;
  8. my $count = {};
  9. for (@numbers) { $count->{$_}++ }
  10. say Dump( $count );
  11. write_file('D:/total_gc_rate.txt', to_json($count) );
复制代码
有两个模块要装:
  1. C:\> ppm install File::Slurp
  2. C:\> ppm install YAML
复制代码
JSON 这个模块内置,数据类型可读性较好。建议用这个作为输出。

另外,哈希用标量引用形式,这样保存为外部数据结构时,比较方便。

论坛徽章:
0
4 [报告]
发表于 2015-04-22 09:16 |只看该作者
回复 2# 程序猿zy
原来的是这样的

就是想把所有的数字都放一起统计


   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2015-04-22 09:48 |只看该作者
本帖最后由 104359176 于 2015-04-22 09:49 编辑

这样的文档就需要用正则匹配了:

my @nums = $text =~ / \d+ (?:\.\d+)? /xmsg;
  1. #!perl

  2. use 5.016;
  3. use File::Slurp qw(read_file write_file);
  4. use YAML qw(Dump);
  5. use JSON qw(to_json from_json);

  6. my $text = read_file 'D:/CG_rate.txt';
  7. my @nums = $text =~ / \d+ (?:\.\d+)? /xmsg;
  8. my $count = {};
  9. for (@nums) { $count->{$_}++ }
  10. say Dump( $count );
  11. write_file('D:/total_gc_rate.txt', to_json($count) );
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2015-04-22 10:04 |只看该作者
用 Perl 6 更简洁,因为 Perl 6 内置了数据的结构化显示功能:
  1. use v6;

  2. my $text = 'input.txt'.IO.slurp;
  3. my @nums = $text ~~ m:g/ \d+ [\.\d+]? /;
  4. my %count;
  5. for @nums { %count{$_}++ }
  6. say %count;
  7. 'output.txt'.IO.spurt(%count.perl);
复制代码

论坛徽章:
0
7 [报告]
发表于 2015-04-22 21:50 |只看该作者
回复 4# 驴小兔


#!/usr/bin/perl -w

use strict;

my $GC_RATE ;
my @array ;
my %count ;

open $GC_RATE, '<', './a' ;

while( <$GC_RATE> ) {
    chomp( $_ ) ;
    if( $_ =~ /^\d+/ ) {
        my @tmp_list = split/ /,$_;
        foreach my $tmp_val ( @tmp_list ) {
            $count{$tmp_val}++;
        }   
    }   
}

foreach my $key ( keys %count ) {
    print "$key -- $count{$key}\n";
}

close $GC_RATE ;



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP