在perl中使用split命令的奇怪问题

时间:2014-09-18 18:03:08

标签: perl

我正在尝试将下面给出的字符串拆分为名称值对,并进一步存储&以与显示顺序相同的顺序显示它。

$tagpair="8=FIX4.2 9=204 35=8 58=90: Unknown Option 10=118";

我试图用split命令做这个,但是当我遇到一个带空格的字符串时我很挣扎(我需要保留它们)。

2 个答案:

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

hashref的输出

注意:如果键/值对的顺序很重要,您想要使用数组或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脚本的力量