perl中使用split命令时出现的奇怪问题

perl中使用split命令时出现的奇怪问题,perl,Perl,我正在尝试将下面给出的字符串拆分为名称-值对,并按照显示的顺序进一步存储和显示它 $tagpair="8=FIX4.2 9=204 35=8 58=90: Unknown Option 10=118"; 我试图用split命令来实现这一点,但当我遇到一个带有空空格的字符串时,我需要保留它们。我怀疑您实际上想要捕获一个数组,而不是两个标量变量。当我进行修复时,我无法重复您的问题: #!/usr/bin/env perl use strict; use warnings; use Data::D

我正在尝试将下面给出的字符串拆分为名称-值对,并按照显示的顺序进一步存储和显示它

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

我试图用split命令来实现这一点,但当我遇到一个带有空空格的字符串时,我需要保留它们。我怀疑您实际上想要捕获一个数组,而不是两个标量变量。当我进行修复时,我无法重复您的问题:

#!/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'
        ];

我想你在寻找更多的东西,比如:

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的输出 注意:如果key/val对的顺序很重要,您可能希望使用数组或Tie::ixash对象

print Dumper($keyval);
$VAR1 = {
          '35' => '8',
          '8' => 'FIX4.2',
          '10' => '118',
          '9' => '204',
          '58' => '90: Unknown Option'
        };
解释 我反转了标记对字符串以绕过可变宽度的lookbehind,否则只需要在键之前的空格上拆分

我在正则表达式中使用了\K来保留等号和键,并且只在空格上拆分-如果您查找\K的含义,文档说它将所有内容都保留在它的左边,空格就在右边,因为我们颠倒了字符串

有几种方法可以循环获得正确的密钥对,在本例中,我使用grep作为循环机制。无论是对是错,它都会循环遍历一系列结果。请记住,结果是在一个反向字符串上生成的,因此生成的数组的顺序是反向的,但为了更好地理解,您可能希望转储生成的字符串也是反向的,因为这样的措辞可能会令人困惑。无论如何,为了以正确的顺序获得key/val对,我们必须重新反转我们创建的数组,这是传递到grep中的内容,记住这些数组元素中的字符串也是反转的,所以我们必须撤销,这是grep中的反转

一旦有了key/val对字符串数组,就需要将它们分解为各自的变量,这是通过在=

通过不使用grep,而是使用另一个foreach循环,您可以编写更干净、更具描述性的代码,但这是为了给您一些新的东西。Perl脚本的威力


你的问题是你很可能在空格上分裂,让标记对分解成键/值对。90:后面有一个psace,因此下一个值未知,然后是选项,该选项没有=分隔符;只需使用并提供输出即可。所以用户可以理解字符串应该如何分割。vol7ron:非常感谢您的回复,这确实回答了我想做的事情,我只需要了解grep语句。此外,我需要保持我解析中的值的顺序,因为我需要在其他地方以相同的顺序打印出来,关于如何做到这一点有什么想法吗?我试着在我的笔记中这样说。使用数组的数组。在for循环中,您可以按@somearray,[$key,$val];稍后循环使用$somearray[0][0]作为第一个键,$somearray[0][1]作为第一个值。另一件需要研究的事情是Tie::Hash或Tie::IxHash来维护关联数组/哈希的键/值对顺序。太棒了,非常感谢您在这里帮助我,我为第一次不清楚向大家道歉。