在perl中将数组拆分为两个数组

时间:2017-03-01 06:09:48

标签: perl split

我正在尝试将数组拆分为两个不同的数组。 第一个是@product, 第二个是@digit

@products = qw/Diapers 759230 TrashBags 272616 ToiletPaper 267112 Condoms 987456 Pencils 231948 Pillows 898923 Crayons 123997 Sheets 231223 Paper 235442 Cups 124409 Napkins 029399/;

打印@product的结果将是: DiapersTrashBagsToiletPaperCondomsPencilsPillowsCrayonsSheetsPaperCupsNapkins ...

5 个答案:

答案 0 :(得分:5)

假设以下两个例子都有以下内容:

use strict;
use warnings;

my @products = qw/Diapers 759230 TrashBags 272616 ToiletPaper 267112 Condoms 987456 Pencils 231948 Pillows 898923 Crayons 123997 Sheets 231223 Paper 235442 Cups 124409 Napkins 029399/;

如果您不关心订单,请利用哈希的属性:

my %hash = @products;
my @digits = values(%hash);
my @product = keys(%hash);

指定产品的名称和编号在@product@digits中都是相同的索引,但@product / @digits中产品的顺序将是与@products中的顺序不同。

如果希望顺序相同,请对偶数和奇数数组进行切片:

my @digits = @products[ grep { ! ($_ % 2) } 0 .. $#products ];
my @product = @products[ grep { $_ % 2 } 0 .. $#products ];

答案 1 :(得分:2)

我认为@products包含每个产品的2值。要迭代产品,您可以使用必备List :: MoreUtils模块中的natatime

use List::MoreUtils qw( natatime );

my $iter = natatime(2, @products);
while (my @product = $iter->()) {
   ...
}

因此,要回答您的问题,您可以使用以下内容:

use List::MoreUtils qw( natatime );

my (@product_names, @product_ids);
my $iter = natatime(2, @products);
while (my @product = $iter->()) {
   push @product_names, $product[0];
   push @product_ids,   $product[1];
}

答案 2 :(得分:1)

@products视为对的列表似乎最可靠,因此我会根据@products中的索引拆分值。

my (@diag, @product);
for my $i (0..$#products){
    if($i & 1 == 1){
        push(@diag,$products[$i]);
    }else {
        push(@product,$products[$i]);
    }
}
print "\@diag:".join(";",@diag)."\n";
print "\@product:".join(";",@product)."\n";

结果是:

@diag:759230;272616;267112;987456;231948;898923;123997;231223;235442;124409;029399
@product:Diapers;TrashBags;ToiletPaper;Condoms;Pencils;Pillows;Crayons;Sheets;Paper;Cups;Napkins

答案 3 :(得分:1)

您可以使用for,

迭代数组
foreach (@products){
    if(/\d/){
        push(@digits,$_);
    }else{
        push(@product,$_);
    }
}

或者,您可以从数组中grep

my(@product) = grep { !/\d/ } @products;
my(@digits) = grep { /\d/ } @products;

答案 4 :(得分:0)

根据其索引是偶数还是奇数,将push每个值简单地放到一个或另一个数组上

use strict;
use warnings 'all';

my @products = qw/
    Diapers     759230
    TrashBags   272616
    ToiletPaper 267112
    Condoms     987456
    Pencils     231948
    Pillows     898923
    Crayons     123997
    Sheets      231223
    Paper       235442
    Cups        124409
    Napkins     029399
/;

my ( @product, @digits );

push @{$_ % 2 ? \@digits : \@product}, $products[$_] for 0 .. $#products;

print "@product\n\n";
print "@digits\n\n";

输出

Diapers TrashBags ToiletPaper Condoms Pencils Pillows Crayons Sheets Paper Cups Napkins

759230 272616 267112 987456 231948 898923 123997 231223 235442 124409 029399