Chinaunix

标题: 如果将string转换成array of hashes 字符串转数组??? [打印本页]

作者: buypro9    时间: 2009-08-08 20:20
标题: 如果将string转换成array of hashes 字符串转数组???
如何将

$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 ??????


谢谢
作者: Perl_Er    时间: 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 编辑 ]
作者: redicaps    时间: 2009-08-08 22:24
@a = eval $str;
作者: buypro9    时间: 2009-08-09 20:21
标题: 回复 #3 redicaps 的帖子
老大。 为什么说比较奇特呢?

是不是我走了弯路?


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

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

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

能否请教一下?



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

最后一个问题是。, 为什么google这个问题的结果那么困难。机会很少有人提到? 难道是我真的绕了弯路。就从没人那么做????
作者: buypro9    时间: 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 编辑 ]
作者: Perl_Er    时间: 2009-08-10 07:40
标题: 回复 #5 buypro9 的帖子
不能执行,报什么错了? 或直接使用3楼给出的  @a = eval $str;如何了?
作者: hitsubunnu    时间: 2009-08-10 08:09
原帖由 buypro9 于 2009-8-9 20:21 发表
老大。 为什么说比较奇特呢?

是不是我走了弯路?



CGI::Session 直接 支持 mysql

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

通过
param 存取变量  完全没必要 自己手工搞来搞去
作者: buypro9    时间: 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错乱。

谁能帮我一下 ?
作者: yashiro_lj    时间: 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);
复制代码

作者: buypro9    时间: 2009-08-10 14:30
标题: 回复 #9 yashiro_lj 的帖子
老大真厉害。完全正确。


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

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

再次感谢。
作者: yashiro_lj    时间: 2009-08-10 14:37
标题: 回复 #10 buypro9 的帖子
desc  => ''

值为空,即undef

desc  => ' '

值为空格

如果是desc  => ''  我还是得到undef

如果在值为空的情况下你不想得到undef,那么就做个判断,然后给这个value赋一个你指定的默认值

以后loop的时候  key和value又会匹配错了。

不会啊,你运行一下我上面改的例子,key和value没有匹配错
作者: buypro9    时间: 2009-08-10 15:39
老大。发觉还是有点问题。
看起来一样。可两段程序接上我后办段的foreach loop后


支持中文的感觉发生了value和key匹配错误。 (注 dump 结果看起来正确。 foreach 执行后用正确。可一但放入tempalate感觉就是发生了value和key匹配错误。 怎么回事啊。


那段不支持中文和空值的。则可以顺利运行。 可就是无法有空格和支持中文。  


我感觉是改后数据源变了即array_of_hash变了。可能哪里多了空格或因素。能再替我看看吗?
作者: yashiro_lj    时间: 2009-08-10 16:15
标题: 回复 #12 buypro9 的帖子
支持中文的感觉发生了value和key匹配错误。 (注 dump 结果看起来正确。 foreach 执行后用正确。可一但放入tempalate感觉就是发生了value和key匹配错误。 怎么回事啊。

什么叫“感觉发生了错误”?如果有错误,把出错信息和情况贴上来吧。

在value中不存在中文、空格、空值的情况下,我写的和你帖的代码得到的结果是一样。所以我估计,即使真的有问题,很大可能是你后面的程序处理中没有考虑到hash的value中存在中文、空格、空值的情况,你检查看看
作者: yashiro_lj    时间: 2009-08-10 16:24
标题: 回复 #8 buypro9 的帖子
@a = eval $str; 也不行的。 返回空白页


eval可以啊,怎么说不行?
  1. use strict;
  2. use warnings;
  3. use Data::Dumper;

  4. my $string = q({file => 'file         1', desc  => ''}, {file => 'file1中文', desc22 => 'desc22we'});
  5. my @arr = eval $string;
  6. print Dumper(\@arr);
复制代码

作者: buypro9    时间: 2009-08-10 19:24
老大,你好。

我意思是

我同样采用两段代码

dumping得结果看起来都一样。


都接上后半段程序。 其实就是一个foreach loop 然后采用了 tempate 在html直接显示处 <%des%>等的值

我测试了一下。如果单就 foreach loop  然后采用 print。结果也正确
但是我需要采用template .结果显示出   <%des%> 不存在。唯一的原因就是没定义过。也就是可能我说得key 和value 匹配错了。


当然是推测而已。  另一个原因导致我怀疑是你的程序问题,是如果我直接定义一个 array of hash 其中也含有中文 空格什么的。结果
可以顺利得到我想要得结果。所以我推断可能输入到foreach loop的数据源有问题。  可到底问题出在哪,一下找不到没方向了。

我只是采用了简单替代法推断以上结论的。 正在慢慢比较。不好意思菜鸟。速度非常慢。
作者: DQP    时间: 2009-08-10 20:39
标题: 回复 #8 buypro9 的帖子
因为原文的串不符合perl语法 少了个' ...........
作者: hitsubunnu    时间: 2009-08-11 11:16
正常的用CGI session + mysql 方法如下

在mysql里

  1. CREATE TABLE sessions (
  2.      id CHAR(32) NOT NULL PRIMARY KEY,
  3.      a_session TEXT NOT NULL
  4.   );
复制代码


CGI session 处理

  1. use CGI;
  2. use CGI::Session;

  3. my $cgi = new CGI;
  4. my $s = new CGI::Session( 'driver:mysql', $cgi, { DataSource  => 'dbi:mysql:test',
  5.                                                    User       => '****',
  6.                                                   Password    => '****' });

  7. my $id = $s->param('file','gogoggog');    ##  存入值  你的file file1 就在这儿设定

  8. my $file = $s->param('file');  ## 取出
复制代码





数据库中 id 和  变量存储样例

  1. | e9f96737e511c8657008d08cddf35832 | $D = {'_SESSION_ID' => 'e9f96737e511c8657008d08cddf35832','_SESSION_ATIME' => 1249959769,'file' => 'gogoggog','_SESSION_REMOTE_ADDR' => '127.0.0.1','_SESSION_CTIME' => 1249959769};;$D |
复制代码

作者: buypro9    时间: 2009-08-11 11:23
标题: 回复 #17 hitsubunnu 的帖子
hitsubunnu 你好。谢谢关注。


CGI::Session; 我暂时无法使用。因为需要改动的主程序得地方太多了。

我暂时采用手工倒数据了。等以后有空了在研究。


主程序是linksql  自己有一套自己的module . 我都不值得从何处着手整合呢。 对我来说太复杂了
作者: hitsubunnu    时间: 2009-08-11 11:36
原帖由 buypro9 于 2009-8-11 11:23 发表
hitsubunnu 你好。谢谢关注。


CGI::Session; 我暂时无法使用。因为需要改动的主程序得地方太多了。

我暂时采用手工倒数据了。等以后有空了在研究。


主程序是linksql  自己有一套自己的module . 我 ...

整合 可以参考 CGI::Session:: Driver 规范

按照原来规则 直接写个driver 也许会起到事半功倍的效果




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