如何将“a = 1,b = 2”拆分为perl中的哈希?

时间:2013-04-11 11:34:48

标签: perl

我想这样做:

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

如果有人可以做这项工作,可以获得奖励......

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

我可以轻松编写带有多个split()的第一个方法,但我想知道是否有一个特殊于Perl的优雅方式,这可以做到......

2 个答案:

答案 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;

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