[英]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=¬_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.