如何在perl中的hash中转换查询字符串

时间:2015-09-21 06:39:32

标签: perl

我有一个像这样的查询字符串:

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

或者它可以是这样的:

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

现在我要创建一个将key作为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;

但问题是在查询字符串中它可以是精简冒号或&那我们该怎么做才能帮助我

3 个答案:

答案 0 :(得分: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' }

答案 1 :(得分:2)

检查这个答案:

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;

答案 2 :(得分:2)

你已经有了一个有效的答案 - 但我个人可能会这样解决它:

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

这样做是使用正则表达式来模式匹配等号的任一侧。

它成对地 - 有效地 - 并且因此被散列分配中的一系列键值处理。

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

但你得到:

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

可替换地:

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

我们使用'任何不是单词或等于'获取一个序列,然后在equals上拆分以产生相同的键值对。再次 - 对有效分隔符/非分隔符字符进行某些假设。