【问题标题】:Perl split and throw away the first element in one linePerl 拆分并丢弃一行中的第一个元素
【发布时间】:2016-03-21 13:41:09
【问题描述】:

我有一些数据应该可以很容易地拆分成散列。

以下代码旨在将字符串拆分为其对应的键/值对,并将输出存储在哈希中。

代码:

use Data::Dumper;

# create a test string
my $string = "thing1:data1thing2:data2thing3:data3";

# Doesn't split properly into a hash
my %hash = split m{(thing.):}, $string;
print Dumper(\%hash);

然而,在检查输出时,很明显这段代码没有按预期工作。

输出:

$VAR1 = {
    'data3' => undef,
    ''      => 'thing1',
    'data2' => 'thing3',
    'data1' => 'thing2'
};

为了进一步调查问题,我将输出拆分为一个数组并打印结果。

代码:

# There is an extra blank element at the start of the array
my @data = split m{(thing.):}, $string;
for my $line (@data) {
    print "LINE: $line\n";
}

输出:

LINE:
LINE: thing1
LINE: data1
LINE: thing2
LINE: data2
LINE: thing3
LINE: data3

如您所见,问题在于split 在数组的开头返回了一个额外的空元素。


有没有什么方法可以从拆分输出中丢弃第一个元素并将其存储在一行中的哈希中?

我知道我可以将输出存储在一个数组中,然后将第一个值移出并将数组存储在一个散列中......但我只是好奇这是否可以一步完成.

【问题讨论】:

    标签: arrays perl hash split


    【解决方案1】:

    my (undef, %hash) = split m{(thing.):}, $string; 会丢弃第一个值。

    【讨论】:

    • 没有。除非数据非常可预测,以至于每个键看起来都像 data\d,否则这是一个荒谬的解决方案
    • 对于问题“有什么方法可以从拆分输出中丢弃第一个元素?”我认为这是正确的答案。
    • 如果数据如此可预测,那么最好先写my %hash = ( thing1 => 'data1', thing2 => 'data2', thing3 => 'data3' )
    【解决方案2】:

    我也建议 - 使用 regex 而不是 split

    #!/usr/bin/env perl
    use strict;
    use warnings;
    use Data::Dumper;
    
    my $string = "thing1:data1thing2:data2thing3:data3";
    
    my %results = $string =~ m/(thing\d+):([A-Z]+\d+)/ig;
    print Dumper \%results;
    

    当然,这确实假设您正在匹配“单词+数字”组,因为如果没有“数字”分隔符,它将无法正常工作。 我的目标是主要说明该技术 - 从字符串中获取“配对”值,因为它们直接分配给哈希。

    您可能需要稍微复杂一点的正则表达式,例如非贪婪量词:

    my %results = $string =~ m/(thing.):(\w+?)(?=thing|$)/ig;
    

    这可能会使它在清晰度方面贬值。

    【讨论】:

    • +1 是一个很好的答案,但对于我正在尝试做的事情来说,它要复杂得多,并且拆分比正则表达式更能保持清晰度。
    • 是的,它并不总是适用。但在许多情况下它确实如此,仅仅是因为您可以丢弃记录分隔符、换行符等。
    猜你喜欢
    • 2023-03-06
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2021-04-21
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多