我想做这个:
my %options = makeHash("user=bob,pass=123");
如果有人可以使这项工作获得奖励积分...
my %options = makeHash('user="bob,a",pass=123');
我可以很容易地用多个 split() 编写第一个方法,但我想知道是否有一种特定于 Perl 的很酷的优雅方式可以做到......
我想做这个:
my %options = makeHash("user=bob,pass=123");
如果有人可以使这项工作获得奖励积分...
my %options = makeHash('user="bob,a",pass=123');
我可以很容易地用多个 split() 编写第一个方法,但我想知道是否有一种特定于 Perl 的很酷的优雅方式可以做到......
您可以使用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;
}
如果您的键和值都是字母数字,那么您可以只写
my %options = "user=bob,pass=123" =~ /\w+/g;
或者,对于您的第二种情况
my %options = 'user="bob,a",pass=123' =~ /(\w+)="?([\w,]+)/g;
您需要明确哪些字符可以出现在数据中,周围是否有空格=
等。