免费注册 查看新帖 |

Chinaunix

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

如果将string转换成array of hashes 字符串转数组??? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-08 20:20 |只看该作者 |倒序浏览
如何将

$string = "{file => 'file1', desc  => 'test}, {file => 'file12', desc => 'test2'}"


转换成

my @array_of_hashes = (
       {file => 'file1', desc  => 'test},
       {file => 'file12', desc  => 'test2'},
  
  );



sting 转 array比较容易 采用split 的方法。可以找倒很多示范
但是如何将string转换成array of hashes ??????


谢谢

论坛徽章:
0
2 [报告]
发表于 2009-08-08 21:00 |只看该作者

回复 #1 buypro9 的帖子

这个想法比较奇特!
试试下面的代码:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my $_ = "{file => 'file1', desc  => 'test1'},{file => 'file12', desc => 'test2'}";

  6. my @array = ();
  7. if(/(.*)\},(.*)/){
  8.         print $1."}","\n";
  9.         push @array, eval "$1}";
  10.         print $2,"\n";
  11.         push @array ,eval "$2";
  12. }

  13. print Dumper \@array;
复制代码

[ 本帖最后由 Perl_Er 于 2009-8-8 21:08 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-08-08 22:24 |只看该作者
@a = eval $str;

论坛徽章:
0
4 [报告]
发表于 2009-08-09 20:21 |只看该作者

回复 #3 redicaps 的帖子

老大。 为什么说比较奇特呢?

是不是我走了弯路?


我是用cgi session 取得了cart的 session.
然后以stirng 形式存入mysql.

结果取出的是是string 这才发觉事情有点麻烦。

关于eval我听人说过。说有安全隐患。 不知道是指什么呢?? 有哪些安全隐患??

能否请教一下?



还是是否可以直接将cgi session  取得的 array以array形式存入 mysql ?我试了以下结果发现内容以为hash(XS1325)这样的。是否可以顺利还原》

最后一个问题是。, 为什么google这个问题的结果那么困难。机会很少有人提到? 难道是我真的绕了弯路。就从没人那么做????

论坛徽章:
0
5 [报告]
发表于 2009-08-09 20:53 |只看该作者

回复 #4 buypro9 的帖子

<code>
#!/usr/bin/perl

use strict;
use warnings;
use Data:umper;

my $_ = "{file => 'file1', desc => 'test1'},{file => 'file12', desc => 'test2'}";

my @array = ();
if(/(.*)\},(.*)/){
print $1."}","\n";
push @array, eval "$1}";
print $2,"\n";
push @array ,eval "$2";
}
print "ragma: no-cache\n";
print "Content-type:text/html\n\n";
print Dumper \@array;


</code>


这个用eval得好像无法执行哦。怎么回事?

[ 本帖最后由 buypro9 于 2009-8-9 21:30 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-08-10 07:40 |只看该作者

回复 #5 buypro9 的帖子

不能执行,报什么错了? 或直接使用3楼给出的  @a = eval $str;如何了?

论坛徽章:
0
7 [报告]
发表于 2009-08-10 08:09 |只看该作者
原帖由 buypro9 于 2009-8-9 20:21 发表
老大。 为什么说比较奇特呢?

是不是我走了弯路?



CGI::Session 直接 支持 mysql

my $s = CGI::Session->new("driver:mysql", undef);

通过
param 存取变量  完全没必要 自己手工搞来搞去

论坛徽章:
0
8 [报告]
发表于 2009-08-10 11:21 |只看该作者
老大。

@a = eval $str; 也不行的。 返回空白页


最后有前辈帮我写了一段

#!/usr/bin/perl
use strict;
use warnings;
use Data:umper;
#$str = "{file => 'file1', desc  => 'test'}, {file => 'file12', desc => 'test2'}"
my $string = q({file => 'file1', desc  => 'test''}, {file => 'file22', desc22 => 'desc22'});
my @array_of_hashes;

my @hashes = $string =~ /(\{.*?\})/g;

for my $hashstr (@hashes) {
    my @keys = $hashstr =~ /(\w+)\s*=>/g;
    my @values = $hashstr =~ /=>\s*\'(\w+)\'/g;
   
    my %hash;
   @hash{@keys} = @values;
   push @array_of_hashes, \%hash;
}

print "ragma: no-cache\n";
print "Content-type:text/html\n\n";
print Dumper(\@array_of_hashes);


#Gives:
#$VAR1 = [
#         {
  #          'desc' => 'test',
   #         'file' => 'file1'
    #      },
     #     {
      #      'desc' => 'test2',
       #     'file' => 'file12'
       #  }
       #];


遗憾的是不支持中文。同时也无法为空的值或者值中有空格。比如以下的形式将导致undef .
谁能再帮我看看。改一下?

请注意看 desc2  => '

my $string = q({file => 'file1', desc  => 'test', desc2  => 'desc 2222', desc3  => 'test3'}, {file => 'file22', desc22 => 'desc22'});  ###这样结果就会有undef 出现。导致key和value错乱。

my $string = q({file => 'file1', desc  => 'test', desc2  => '', desc3  => 'test3'}, {file => 'file22', desc22 => 'desc22'});  ###这样结果就会有undef 出现。导致key和value错乱。

谁能帮我一下 ?

论坛徽章:
0
9 [报告]
发表于 2009-08-10 13:55 |只看该作者

回复 #8 buypro9 的帖子

在你贴的代码基础上改了一下,以支持值中的空格、中文或值为空
  1. use strict;
  2. use warnings;
  3. use Data::Dumper;

  4. my $string = q({file => 'file      1', desc  => ''}, {file => 'file中文', desc22 => 'desc22'});
  5. my @hashes = $string =~ /\{([^}]*)\}/g;
  6. my @array_of_hashes;

  7. for my $hashstr (@hashes) {
  8.    my @keys = $hashstr =~ /(\S+)\s*=>/g;
  9.    my @values = $hashstr =~ /=>\s*\'([^']+)\'/g;
  10.    
  11.    my %hash;
  12.    @hash{@keys} = @values;
  13.    push @array_of_hashes, \%hash;
  14. }
  15. print Dumper(\@array_of_hashes);
复制代码

论坛徽章:
0
10 [报告]
发表于 2009-08-10 14:30 |只看该作者

回复 #9 yashiro_lj 的帖子

老大真厉害。完全正确。


还有点小问题。当值为空的时候。  desc  => '' 还是  desc  => ' '?

如果是desc  => ''  我还是得到undef  以后loop的时候  key和value又会匹配错了。

再次感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP