2015-09-21 52 views
1

我有一个查询字符串是这样的:如何查询字符串转换成哈希在Perl

id=60087888;jid=16471827;from=advance;action=apply 

,也可以是这样的:

id=60087888&jid=16471827&from=advance&action=apply 
从这个

现在我想创建一个散列这将有关键的ID,并将其值

我已经这样做了

my %in; 
     $buffer = 'resid=60087888;jobid=16471827;from=advance;action=apply'; 
     @pairs = split(/=/, $buffer); 
     foreach $pair (@pairs){ 
      ($name, $value) = split(/=/, $pair); 
      $in{$name} = $value; 
     } 

print %in; 

但问题是在查询字符串也可以是肖明结肠或&那么如何才能做到这一点,请帮助我

回答

1

检查这个答案:

my %in; 
     $buffer = 'resid=60087888;jobid=16471827;from=advance;action=apply'; 
     @pairs = split(/[&,;]/, $buffer); 
     foreach $pair (@pairs){ 
      ($name, $value) = split(/=/, $pair); 
      $in{$name} = $value; 
     } 
delete $in{resid}; 
print keys %in; 
1

你已经过问题的解答 - 但我个人可能解决这样的:

my %in = $buffer =~ m/(\w+)=(\w+)/g; 

这样做有什么用正则表达式等号的模式匹配任何一方签署。

它以成对的方式实现 - 因此可以有效地处理哈希赋值中的一系列键值。

注意 - 它确实假定您的键/值中没有特殊字符,并且没有空值。 (或者如果你这样做,他们将被忽略 - 如果是这种情况,你可以使用(\w*))。

但你:

$VAR1 = { 
      'from' => 'advance', 
      'jid' => '16471827', 
      'action' => 'apply', 
      'id' => '60087888' 
     }; 

或者:

my %in = map { split /=/ } split (/[^=\w]/, $buffer); 

我们使用“任何不是单词或等于”得到一个序列分割,再拆就等于使相同的键值对。再次 - 对有效的分隔符/非分隔符字符进行某些假设。

3

不要试图用新代码解决它;这是CPAN模块的用途。具体地,在这种情况下,URI::Query

use URI::Query; 
use Data::Dumper; 

my $q = URI::Query->new("resid=60087888;jobid=16471827;from=advance;action=apply"); 
my %hash = $q->hash; 

print Dumper(\%hash); 

给出

{ action => 'apply', 
    from => 'advance', 
    jobid => '16471827', 
    resid => '60087888' }