2012-02-02 52 views
0

对于一个简单的问题抱歉,但我对Perl很陌生! 我有一个名为阵列@input它有如下数据(注意@input的大小并不总是相同):在Perl中重新排列数组

[0] 20004 11189 20207 
[1] 12345 1234 123 12 1 

我想创建一个新的阵列称为@elements其重新排列数据为:

[0] 20004 
[1] 11189 
[2] 20207 
[3] 12345 
[4] 1234 
[5] 123 
[6] 12 
[7] 1 

谢谢!

+7

当你说'[0] 20004 11189 20207',你的意思是元素[0]包含一个字符串使用这些值,或该元素[0]是本身含有三个值另一个数组?如果您可以发布调试器命令'x @ input'的输出将会非常有帮助。 – 2012-02-02 17:23:39

回答

0
$tmparr = join(" ", @input); 
@elements = split(" ", $tmparr); 

这是行得通吗?

编辑:TLP提供在下面的评论一更好的解决方案,map split, @input

+0

谢谢!这项工作 – 2012-02-02 17:33:10

+1

为什么在不需要时使用转换变量?当插值做同样的事情时加入? '@elements = split'',“@input”' – TLP 2012-02-02 17:48:24

+0

为什么在不需要时使用'split'参数? '@input = map {split} @ input'。 – 2012-02-02 18:12:55

1

比乔恩的回答更高效:

@output = map { split// } @input; 
+2

'@output = map split,@input' – TLP 2012-02-02 17:50:42

+0

@TLP请将您的解答作为答案 – Borodin 2012-02-02 18:44:00

+0

@Borodin我发布了一个答案。使用'split'是dolmen的答案,我使用'/ \ d +/g',它基本上做同样的事情。 – TLP 2012-02-02 18:51:08

2

好,无论是它的一维数组需要分裂,或者需要扁平化的二维。所以,这是每个任务的一个子集。

use v5.10; 
use strict; 
use warnings; 

my @input1 = ("20004 11189 20207", "12345 1234 123 12 1"); 
my @input2 = ([qw"20004 11189 20207"], [qw"12345 1234 123 12 1"]); 

sub one_dim { # Simple extract digits with regex 
    return map /\d+/g, @_; 
    # return map split, @_; # same thing, but with split 
} 
sub two_dim { # Simple expand array ref 
    return map @$_, @_; 
} 

my @new = one_dim(@input1); 
say for @new; 
@new = two_dim(@input2); 
say for @new;