我正在尝试将下面给出的字符串拆分为名称值对,并进一步存储&以与显示顺序相同的顺序显示它。
$tagpair="8=FIX4.2 9=204 35=8 58=90: Unknown Option 10=118";
我试图用split命令做这个,但是当我遇到一个带空格的字符串时我很挣扎(我需要保留它们)。
答案 0 :(得分:1)
我怀疑你想要实际捕获一个数组,而不是两个标量变量。当我做出修复时,我无法重复你的问题:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my $tagpair = "8=FIX4.2 9=204 35=8 58=90: Unknown Option 10=118";
my @values = split(/=/, $tagpair);
print Dumper \@values;
这是我得到的:
$ ./test60.pl
$VAR1 = [
'8',
'FIX4.2 9',
'204 35',
'8 58',
'90: Unknown Option 10',
'118'
];
答案 1 :(得分:1)
我想你会更喜欢这样的东西:
my $tagpair = "8=FIX4.2 9=204 35=8 58=90: Unknown Option 10=118";
my $rev = reverse $tagpair;
my $keyvalpairs = [ grep {$_=reverse $_} reverse @{[ split(/(?:=[^\s]+)\K\s/, $rev) ]} ];
my $keyval = {}; #unnecessary but used to display output
foreach my $pair (@$keyvalpairs){
my ($key,$val) = split/\=/, $pair;
$keyval->{$key} = $val; #unnecessary but used to display output
}
注意:如果键/值对的顺序很重要,您想要使用数组或Tie :: IxHash对象。
print Dumper($keyval);
$VAR1 = {
'35' => '8',
'8' => 'FIX4.2',
'10' => '118',
'9' => '204',
'58' => '90: Unknown Option'
};
我颠倒了tagpair字符串以绕过可变宽度的lookbehind,否则你需要在 之前只分割空格p>
我在RegEx中使用\K
来保持等号和键并且仅在空格上拆分 - 如果你查找\K
的意思是文档说它保留了左边的所有内容(空格是向右的,因为我们颠倒了字符串)
有几种方法可以循环获取正确的keyvalpair,在这种情况下,我使用grep
作为循环机制。 对或错,它循环遍历结果数组。请记住,结果是在反向字符串上生成的,因此生成的数组顺序相反,但生成的字符串也是如此(您可能希望转储以便更好地理解,因为该措辞可能会令人困惑)。无论如何,为了以正确的顺序获得键/值对,我们必须重新反转我们创建的数组(这是传递给grep
的内容),记住那些数组元素中的字符串也是反转,所以我们必须撤消(grep
内的反面)
一旦你有了一组key / val对字符串,你需要将它们分解为各自的变量,这是使用foreach
循环(在=
上拆分)完成的
您可以通过不执行grep
而不是使用另一个foreach
循环来编写更清晰,更具描述性的代码,但这是为了给您一些新的东西。 Perl脚本的力量