免费注册 查看新帖 |

Chinaunix

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

求会perl的朋友帮忙看看啊 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-23 20:10 |只看该作者 |倒序浏览
本帖最后由 zengxuli 于 2013-07-24 19:19 编辑

a   b
1   -1
1   2
1   3
2   4
2   5
2   7
3   8
3   9
3   0

论坛徽章:
0
2 [报告]
发表于 2013-07-23 20:47 |只看该作者
是学生交作业? 什么学校还有这课 还是自己做吧

论坛徽章:
0
3 [报告]
发表于 2013-07-23 22:28 |只看该作者
本帖最后由 zengxuli 于 2013-07-24 19:18 编辑

回复 2# remark

哎,自己知道思路但是不知道怎么用这个语言来写啊,头大额,前辈我想问问比如说统计111对应的值把相应的结果存入二维数组中,以111,222,333为二维数组的行,以对应的值作为列,这样处理行吗,还是perl有比较简单的方法啊,谢谢前辈

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
4 [报告]
发表于 2013-07-24 00:53 |只看该作者
本帖最后由 stanley_tam 于 2013-07-24 10:15 编辑

偶试试,正好100行,呵呵
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use IO::Dir;

  5. sub get_txt_from;
  6. sub get_fh;
  7. sub strip;
  8. sub process;
  9. sub main;

  10. our %interval_g_counter_for = ();
  11. our %values_of_g_for = ();
  12. our $containing_folder = 'A';
  13. main();

  14. sub main {
  15.     my $texts_aref = get_txt_from($containing_folder);
  16.     for my $file (@{$texts_aref}){
  17.         process($file);
  18.     }

  19.     # 0-5,6-10,11-15,16-20
  20.     for my $key (keys %interval_g_counter_for){
  21.         my $value = $interval_g_counter_for{$key};
  22.         print "$key => [$value]\n";
  23.     }

  24.     #  11 22 33 44
  25.     for my $key (sort keys %values_of_g_for){
  26.         my @values_g = @{ $values_of_g_for{$key} };
  27.         print "When B is $key, the values for g are [@values_g]\n";
  28.     }
  29. }

  30. sub process {
  31.     my ($file) = @_;
  32.     my $fh = get_fh($file);
  33.     while(defined(my $line = <$fh>)){
  34.         $line = strip($line);
  35.         next if !$line;
  36.         # skip lines not start with 11 22 33 44
  37.         if ($line =~ m{^ (:? [1234]) \1 \s+}mix) {
  38.             my ($b, $g) = (split /\s+/, $line)[0, 5];
  39.             $b ||= 0;
  40.             $g ||= 0;

  41.             if ($g <= 5) {
  42.                 $interval_g_counter_for{'0to5'}++;
  43.             }
  44.             elsif ($g <=10) {
  45.                 $interval_g_counter_for{'5to10'}++;
  46.             }
  47.             elsif ($g <=15) {
  48.                 $interval_g_counter_for{'11to15'}++;
  49.             }
  50.             elsif ($g <=20) {
  51.                 $interval_g_counter_for{'16to20'}++;
  52.             }
  53.             else {
  54.                 $interval_g_counter_for{'21to'}++;
  55.             }

  56.             # hash values are array reference, auto vivification...
  57.             push @{$values_of_g_for{$b}}, $g;
  58.         }
  59.     }
  60.     close $fh;
  61. }

  62. sub get_txt_from {
  63.     my ($dir) = @_;
  64.     my @files = ();

  65.     my $d_fh = IO::Dir->new($dir);
  66.     if (defined $d_fh) {
  67.         while ( defined(my $file = $d_fh->read) ) {
  68.             next if $file eq '.';
  69.             next if $file eq '..';
  70.             next if $file !~ m{ \.txt $}mix;
  71.             push @files, "$dir/$file";
  72.         }
  73.     }
  74.     return \@files;
  75. }

  76. sub get_fh {
  77.     my ($file, $mode) = @_;
  78.     open my $fh, $mode, $file or
  79.         die "Fail to open file $file:$!\n";
  80.     return $fh;
  81. }

  82. sub strip {
  83.     my ($str) = @_;
  84.     chomp $str;
  85.     $str =~ s{^\s+ | \s+$}{}gmx;
  86.     return $str;
  87. }

  88. __END__
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
5 [报告]
发表于 2013-07-24 06:10 |只看该作者
试试:
  1. #!/usr/bin/perl
  2. use 5.018;
  3. my $DIR = '/tmp';     
  4. @ARGV = glob "$DIR/*.txt";
  5. my ( @K, %B, %G ) = qw/ c d e f g h i /;
  6. while (<>) {
  7.     my ( $B, @s );
  8.     ( $B, @s ) = split if /^\d+/;
  9.     next unless @s == 7;
  10.     $G{ $s[4] }++;
  11.     map { push @{ $B{$B}{$_} }, shift @s } @K;
  12. }

  13. sub GRANGE {
  14.     my ( $h, $t, $c ) = @_;
  15.     map { $c += $G{$_} } grep { $_ >= $h && $_ <= $t } keys %G;
  16.     $c;
  17. }
  18. sub ELIST { @{ $B{ $_[0] }{ $_[1] } } }

  19. say "[ G:0-5 ]  ", GRANGE( 0, 5 );                 # [ G:0-5 ]  3
  20. say "[ 11: g ]  ", join '|', ELIST( 11, 'g' );    # [ 11: g ]  2|4|5|6|8
复制代码
change line 3 :
  1. my $DIR = '/tmp';  
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-07-24 06:11 |只看该作者
change line 5:
  1. my ( @K, %B, %G ) = qw/ c d e f g h i /;
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-07-24 10:03 |只看该作者
本帖最后由 zengxuli 于 2013-07-24 10:18 编辑

第五行下面的好多都看不懂额,你能不能给我注释注释讲讲你的思路啊,我是想的先找到文件夹下面所有匹配的.txt文件,然后对于这些文件中的每一个.txt文件进行处理。每个的处理方式是先读取该文件中的所有行存到对象中,在统计g值得分布的时候,对于每一行去查找"g"这个关键词,设置一个标记位,看是否找到,找到则为1,退出该行,查找下面的行,找到'-------'则设为0,然后判断该标记位为1则去掉该行数据间的空格,用','代替存到数组中去,然后判断该数组中的对应g值属于哪个分区,从而进行统计。,回复 6# rubyish


   

论坛徽章:
0
8 [报告]
发表于 2013-07-24 10:14 |只看该作者
在统计b对应的g值时,一行行判断,查找关键字”b”,如果找到了,则将flag标志位记为1,如果找到'--------'则记为0。判断标志位如果为1,则将文本中数据之间以及开头的空格去掉,每行中数字之间的空格用逗号代替,这样把文件中的这些数据存放到二维数组中(二维数组多大没定,因为有的.txt文件中数据是像我提问中写的那样,有的会多一些b值(b值其实是不定的,有的就像写的11,22,33,但是也有45,67这样的情况,但是确定的一点是比如11就对应有5行,这个是确定的))。现在看二维数组的第一列有哪些b,将统计出的b值放到另一个二维数组的行中,再来判断如果二维数组中的列为该一维数组中对应的值,则将相应的g值放到b的值的二维数组对应的列中。这样最终查看b值时,就能查看相对应的g值了。不知道这样想是不是复杂了,求教啊,感激涕零回复 5# rubyish


   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
9 [报告]
发表于 2013-07-24 10:32 |只看该作者
@ARGV = glob "$DIR/*.txt";
这个glob不错,还以为在windows下不能用呢。

论坛徽章:
0
10 [报告]
发表于 2013-07-24 10:35 |只看该作者
查看b对应的g值这个功能不知道是怎么实现的额,还有一个应该是我没说清楚的一点是b值可能是11,22,33,44,34,56等等还有可能是别的值,这个值其实是不定的,这样的话该怎么处理呢,谢谢回复 4# stanley_tam


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP