Chinaunix

标题: 文件怎么读入hash [打印本页]

作者: 609854    时间: 2013-11-12 14:07
标题: 文件怎么读入hash

大神,帮忙看下整个文件怎么读进hash。

DATA:
  1. [NAME]
  2. TOM

  3. [AGE]
  4. 23

  5. [TALL]
  6. 180CM

  7. [favorite person]
  8. Lily
  9. Jimmy

复制代码
一个一个的读我用的是:
  1. while(<DATA>){
  2.     my $match_key = shift;
  3.     if (m/$match_key/ig..m/\[.*\]/ig){
  4.            print;
  5.     }
  6. }
复制代码

作者: pitonas    时间: 2013-11-12 14:07
  1. my ( $value, @hash ) = 1;
  2. while (<DATA>) {
  3.     next if /^\s*$/;
  4.     if (/\[(.*)\]/) {
  5.         push @hash, $value == 0 ? ( '', $1 ) : $1;
  6.         $value = 0;
  7.     }
  8.     elsif ($value) {
  9.         chomp;
  10.         ref $hash[-1]
  11.           ? push @{ $hash[-1] }, $_
  12.           : ( $hash[-1] = [ $hash[-1], $_ ] );
  13.     }
  14.     else {
  15.         chomp;
  16.         push @hash, $_ and $value++;
  17.     }
  18. }
  19. my %hash = @hash;

  20. print $hash{NAME};

  21. __DATA__
  22. [NAME]
  23. TOM

  24. [AGE]
  25. 23

  26. [TALL]
  27. 180CM

  28. [favorite person]
  29. Lily
  30. Jimmy

  31. [NO Value]

  32. [LAN]
  33. perl
复制代码
回复 1# 609854


   
作者: mcshell    时间: 2013-11-12 16:42
回复 1# 609854
  1. my $h;
  2. while(<DATA>){
  3.     next if /^\s*$/;
  4.     /[[]([^]]+)/?$h->{$1}=():push @{$h->{$1}},$_;
  5. }
  6. print "$_=>",@{$h->{$_}},"\n" for keys $h;

  7. __DATA__
  8. [NAME]
  9. TOM

  10. [AGE]
  11. 23

  12. [TALL]
  13. 180CM

  14. [favorite person]
  15. Lily
  16. Jimmy

  17. [NO Value]

  18. [LAN]
  19. perl
复制代码

作者: 609854    时间: 2013-11-12 16:59
回复 2# pitonas


    ref $hash[-1]
          ? push @{ $hash[-1] }, $_
          : ( $hash[-1] = [ $hash[-1], $_ ] );

这个是什么意思。
作者: rubyish    时间: 2013-11-12 22:48
回复 3# mcshell
  1.     /[[]([^]]+)/?$h->{$1}=():push @{$h->{$1}},$_;
复制代码

   

   
作者: mcshell    时间: 2013-11-13 08:56
{:3_190:} {:3_190:} 回复 5# rubyish


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2