将复杂的线分成数组

时间:2012-04-11 20:47:02

标签: perl

我有一个数组,其中元素看起来像这样(包括空格)

@array = (
"    795     0|  1",
"      5   135| 17",
"     12   161| 17",
"    244    22| 17",
"     11    25| 17",
"    249   389| 17",
"  22383   443| 17"
);

我需要拿出一个元素

"    795     0|  1"

并将其分成3个数字,摆脱白色空格和“|”在每一行。

@new_array =("795","0","1");

我遇到的问题是数字的空白和大小各不相同。

4 个答案:

答案 0 :(得分:4)

我会使用仅匹配数字的正则表达式:

#!/usr/bin/perl

use strict ;
use warnings ;
use Data::Dumper ;

my @array = (
"    795     0|  1",
"      5   135| 17",
"     12   161| 17",
"    244    22| 17",
"     11    25| 17",
"    249   389| 17",
"  22383   443| 17"
);

foreach my $item ( @array ) {
  my @tmp = $item =~ m/(\d+)/g ;
  printf "'%s' => %s\n" , $item , Dumper( \@tmp ) ;
}

如果字符串在开头没有空格,这也可以。

答案 1 :(得分:3)

一种方式:

my ($empty, @array)  = split(/\|?\s+/, "    795     0|  1");

答案 2 :(得分:1)

也许更容易和可读的东西可能会有所帮助:

#!/usr/bin/perl

use strict;
use warnings;

my @array = (
"    795     0|  1",
"      5   135| 17",
"     12   161| 17",
"    244    22| 17",
"     11    25| 17",
"    249   389| 17",
"  22383   443| 17"
);

my $eggs;

for my $spam (@array) {
    chomp $spam;
    $spam =~ s/^\s*//;
    push @$eggs,  [ split ( /\|?\s+/, $spam ) ];
}

for my $egg (@$eggs) {
    print join (", ", @$egg);
    print "\n";
}

结果是:

795, 0, 1
5, 135, 17
12, 161, 17
244, 22, 17
11, 25, 17
249, 389, 17
22383, 443, 17

答案 3 :(得分:0)

如果你的间距是真正统一的,你可以使用Perl的unpack来获取数据。见http://perldoc.perl.org/perlpacktut.html#Packing-Text