如何在Perl中将查询字符串转换为哈希

3

我有一个如下的查询字符串:

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;

但问题在于查询字符串中可能是分号或&,那么我们该如何处理呢?请帮帮我。

5个回答

6
不要试图用新代码解决这个问题,这就是 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' }

3

你已经有了一个可行的答案 - 但个人而言,我可能会这样处理:

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

这段代码使用正则表达式来匹配等号两侧的内容。它成对地进行匹配,从而在哈希赋值中被视为一系列键值对。请注意,它假设您的键/值中没有特殊字符,并且没有空值(如果有,则将被忽略-如果是这种情况,可以使用(\w *))。但您会得到:
$VAR1 = {
          'from' => 'advance',
          'jid' => '16471827',
          'action' => 'apply',
          'id' => '60087888'
        };

或者:

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

我们使用“非单词字符或等号”的内容进行分割以获得序列,然后根据等号进行分割以生成相同的键值对。再次说明-针对有效分隔符/非分隔符字符做出了某些假设。

这不允许字符串中存在“空”值。'id=60087888&jid=16471827&from=advance&action=apply&blank=&not_blank=1';会产生意想不到的结果。 - joehep

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;

0

我知道我来晚了,但是....

#!/usr/bin/perl

use strict;
use CGI;
use Data::Dumper;

my $query = 'id=60087888&jid=16471827&from=advance&action=apply&blank=&not_blank=1';

my $cgi = CGI->new($query);

my %hash = $cgi->Vars();

print Dumper \%hash;

将会产生:

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

这样做的额外好处是处理源字符串中可能没有值的键。

其他一些示例将产生:

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

这可能不是理想的。

我本来会使用 URI::Query @LeoNerd 的答案,但在我的情况下我没有安装模块的能力,而 CGI.pm 很方便。


0

另外,你也可以

my $buffer = 'id=60087888&jid=16471827&from=advance&action=apply'; 
my %hash = split(/&|=/, $buffer);

这将会给出:

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

这个非常脆弱,所以我不建议使用它。


这利用了在Perl中哈希是具有偶数元素的数组的事实。 - joehep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接