繁体   English   中英

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

[英]How to convert query string in hash in perl

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

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

或者可以是这样的:

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

现在,我想创建一个 hash ,它将键作为 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;

但问题出在查询字符串中,它可以是半分号或 & 所以我们该怎么做,请帮助我

不要尝试用新代码解决它; 这就是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' }

检查以下答案:

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;

您已经有一个可行的答案-但就我个人而言,我可以这样解决:

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上进行拆分以创建相同的键值对。 再次-对有效的定界符/非定界符进行某些假设。

我知道我比赛迟到了,但是......

#!/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 很方便。

另外,你可以

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

这使:

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

这是非常脆弱的,所以我不提倡使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM