-3

我想做这个:

my %options = makeHash("user=bob,pass=123");

如果有人可以使这项工作获得奖励积分...

my %options = makeHash('user="bob,a",pass=123');

我可以很容易地用多个 split() 编写第一个方法,但我想知道是否有一种特定于 Perl 的很酷的优雅方式可以做到......

4

2 回答 2

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;
}
于 2013-04-11T11:42:07.837 回答
1

如果您的键和值都是字母数字,那么您可以只写

my %options = "user=bob,pass=123" =~ /\w+/g;

或者,对于您的第二种情况

my %options = 'user="bob,a",pass=123' =~ /(\w+)="?([\w,]+)/g;

您需要明确哪些字符可以出现在数据中,周围是否有空格=等。

于 2013-04-11T11:40:48.760 回答