将数组拆分为所需的格式

时间:2017-02-20 07:27:05

标签: arrays perl split

我在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

  3. 我正在尝试第一个案例,但我无法找到解决方案

    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第二种情况吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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