我有一个像这样的查询字符串:
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;
但问题是在查询字符串中它可以是精简冒号或&那我们该怎么做才能帮助我
答案 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上拆分以产生相同的键值对。再次 - 对有效分隔符/非分隔符字符进行某些假设。