我有一个键值对字符串,其中对以逗号分隔,但值有嵌套逗号。
离。
"key1|val1,key2|val2_a,val2_b,val2_c,key3|val3"
我想将其分解为哈希并使用以下内容进行攻击:
my $str = "key1|val1,key2|val2_a,val2_b,val2_c,key3|val3";
my @vars = split(/([^,\s]+)\|/ ,$str);
my @arr = splice @vars, 1;
my %hash = @arr;
print Dumper(\%hash);
给了我:
$VAR1 = {
'key2' => 'val2_a,val2_b,val2_c,',
'key1' => 'val1,',
'key3' => 'val3'
};
我正在寻找一种更优雅的方式来做到这一点。我认为它可以用一个正则表达式来完成,但我无法搞清楚它。有人能指出我正确的方向吗?
答案 0 :(得分:4)
尝试在分割中使用正向前瞻。
#!/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $str = "key1|val1,key2|val2_a,val2_b,val2_c,key3|val3";
my %hash = split(/\||,(?=\w+\|)/, $str);
print Dumper(\%hash);
输出:
$VAR1 = {
'key2' => 'val2_a,val2_b,val2_c',
'key1' => 'val1',
'key3' => 'val3'
};
我发现这个tutorial可以很好地解释周围环境。
答案 1 :(得分:1)
难以决定每个键的值列表的结束位置。最明显的是它可以在字符串的末尾,或者更加模糊,在另一个键值对开始的地方。 (这是一个可怕的设计。可以在找到更难解决的问题之前修复它吗?)
此解决方案通过为"键"定义正则表达式来工作。 string(除了管道,逗号或空格之外的任何东西),然后用它来构建一个完整的键值对的模式,它在字符串的末尾或另一个"逗号 - 键 - 管道&#34结束;序列开始。
use strict;
use warnings;
my $s = 'key1|val1,key2|val2_a,val2_b,val2_c,key3|val3';
my $key_re = qr/ [^|,\s]+ /x;
my @pairs = $s =~ / $key_re \| [^|\s]+ (?= \z | , $key_re \| )/gx;
print "$_\n" for @pairs;
<强>输出强>
key1|val1
key2|val2_a,val2_b,val2_c
key3|val3