我想这样做:
my %options = makeHash("user=bob,pass=123");
如果有人可以做这项工作,可以获得奖励......
my %options = makeHash('user="bob,a",pass=123');
我可以轻松编写带有多个split()的第一个方法,但我想知道是否有一个特殊于Perl的优雅方式,这可以做到......
答案 0 :(得分:8)
您可以使用Text::ParseWords
(Perl 5中的核心模块)解析字段,还可以克服字段内引用的逗号。请注意,返回值是哈希引用,而不是哈希值。
use strict;
use warnings;
use Text::ParseWords;
my $options = makeHash('user="bob,a",pass=123');
sub makeHash {
my $str = shift;
my @foo = quotewords(',', 0, $str); # split into pairs
my %hash = quotewords('=', 0, @foo); # split into key + value
return \%hash;
}
答案 1 :(得分:1)
如果你的键和值都是字母数字,那么你可以写
my %options = "user=bob,pass=123" =~ /\w+/g;
或者,对于你的第二个案例
my %options = 'user="bob,a",pass=123' =~ /(\w+)="?([\w,]+)/g;
您需要清楚明确哪些字符可以出现在您的数据中,无论=
等周围是否有空格。