【问题标题】:Splitting an array to the required format将数组拆分为所需的格式
【发布时间】:2017-02-20 07:27:05
【问题描述】:

我在 Perl 中有一个这样的数组,

my @a = (
    '12345 abcd efgh ijkl mnop',
    '23456 asdf sdfse ert vsfg',
    '56706 isdua sdf sef mnvsdf',
)

我需要按以下方式存储它

  1. 第一列单独在一个单独的变量中,用逗号分隔 , 就像这样 12345,23456,56706

  2. 前两列用冒号分隔:,然后用逗号分隔,,就像这样12345:abcd,23456:asdf,56706:isdua

我正在尝试第一种情况,但我找不到解决方案

foreach my $s (@a){
    my @entries = split(/ /, $s); 
    my $_p = $entries[0]; 
    $csv1 = join(',', $_p);
}

我只得到最后一个值56706

我使用了$csv2 = $csv2 . "," . $_p;,我得到了,12345,23456,56706

谁能告诉我如何获得12345,23456,56706 也是第二种情况?

【问题讨论】:

  • 12345:abcd,23456:asdf,56706:isdua12345,23456,56706 您需要哪个输出。

标签: arrays perl split


【解决方案1】:

我将首先使用map 构建一个包含每行前两个值的数组。之后,只需将join 应用于新列表的适当映射

use strict;
use warnings 'all';
use feature 'say';

my @a = (
    '12345 abcd efgh ijkl mnop',
    '23456 asdf sdfse ert vsfg',
    '56706 isdua sdf sef mnvsdf',
);

my ($s1, $s2);

{
    my @pairs = map [ ( split )[0,1] ], @a;

    $s1 = join ',', map $_->[0], @pairs;

    local $" = ':';
    $s2 = join ',', map "@$_", @pairs;
}

say $s1;
say $s2;

输出

12345,23456,56706
12345:abcd,23456:asdf,56706:isdua

【讨论】:

    【解决方案2】:

    您可以检查累加变量的长度以了解您是否处于循环的第一次迭代中,并且仅在您不在时添加逗号。

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    my @array = ('12345 abcd efgh ijkl mnop',
                 '23456 asdf sdfse ert vsfg',
                 '56706 isdua sdf sef mnvsdf',
    );
    
    my ($first_one, $first_two);
    for my $element (@array) {
        my @entries = (split ' ', $element)[ 0, 1 ];
        $first_one .= (length $first_one ? ',' : '') . $entries[0];
        $first_two .= (length $first_two ? ',' : '') . "$entries[0]:$entries[1]";
    }
    
    print $first_one, "\n", $first_two, "\n";
    

    您真的想在变量中累积结果吗?您不想将它们打印到文件中吗?如果是,甚至可以逐行处理输入,而不是将其加载到数组中。

    【讨论】:

    • 您给出的答案是预期的。我是 perl 的新手。你能告诉我为什么我不能使用加入吗?
    • @VinuShankar:您在每次迭代中都覆盖了 $csv1。你当然可以使用$first_one = join ',', $first_one // (), $entries[0];
    猜你喜欢
    • 2012-04-29
    • 2023-03-13
    • 2021-09-02
    • 2017-12-21
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多