2011-08-28 65 views
5

我有一个未知数量的单词数组,具有未知的最大长度。 我需要将其转换为另一个数组,基本上将其转换为列字数组。 所以用这种原始的数组:如何将单词数组转换为包含单词字符的数组?

@original_array = ("first", "base", "Thelongest12", "justAWORD4"); 

的resluting阵列将是:

@result_array = ("fbTj","iahu","rses","selt","t oA"," nW"," gO"," eR"," sD"," t4"," 1 "," 2 "); 

其实我都会有这样的:

fbTj 
iahu 
rses 
selt 
t oA 
    nW 
    gO 
    eR 
    sD 
    t4 
    1 
    2 

我需要做的是,为了使表,这些词是表格的标题。 我希望我已经表达清楚,并感谢您愿意给予的帮助。

我与分割功能尝试过,但我一直搞乱起来......

编辑: 大家好,感谢所有的提示和建议!我从大家那里学到了很多东西,因此得到了赞赏。然而,我发现tchrist的答案更方便,也许是因为我来自c,c#背景...... :)

回答

5

我有一个老程序可以做到这一点。也许你能适应它:

$ cat /tmp/a 
first 
base 
Thelongest12 
justAWORD4 

$ rot90 /tmp/a 
fbTj 
iahu 
rses 
selt 
t oA 
    nW 
    gO 
    eR 
    sD 
    t4 
    1 
    2 

这里的源:

$ cat ~/scripts/rot90 
#!/usr/bin/perl 
# rot90 - [email protected] 

$/ = ''; 

# uncomment for easier to read, but not reversible: 
### @ARGV = map { "fmt -20 $_ |" } @ARGV; 

while (<>) { 
    chomp; 
    @lines = split /\n/; 
    $MAXCOLS = -1; 
    for (@lines) { $MAXCOLS = length if $MAXCOLS < length; } 
    @vlines = (" " x @lines) x $MAXCOLS; 
    for ($row = 0; $row < @lines; $row++) { 
     for ($col = 0; $col < $MAXCOLS; $col++) { 
      $char = (length($lines[$row]) > $col ) 
        ? substr($lines[$row], $col, 1) 
        : ' '; 
      substr($vlines[$col], $row, 1) = $char; 
     } 
    } 
    for (@vlines) { 
     # uncomment for easier to read, but again not reversible 
     ### s/(.)/$1 /g; 
     print $_, "\n"; 
    } 
    print "\n"; 
} 
7
use strict; 
use warnings; 
use 5.010; 
use Algorithm::Loops 'MapCarU'; 

my @original_array = ("first", "base", "Thelongest12", "justAWORD4"); 
my @result_array = MapCarU { join '', map $_//' ', @_ } map [split //], @original_array; 
+0

+1对于功能性方法,像往常一样最简洁 – daxim

1
use strict; 
use warnings; 
use List::Util qw(max); 

my @original_array = ("first", "base", "Thelongest12", "justAWORD4"); 
my @new_array = transpose(@original_array); 

sub transpose { 
    my @a = map { [ split // ] } @_; 
    my $max = max(map $#$_, @a); 
    my @out; 
    for my $n (0 .. $max) { 
     $out[$n] .= defined $a[$_][$n] ? $a[$_][$n] : ' ' for 0 .. $#a; 
    } 
    return @out; 
} 
0

可以通过这个简单的一行容易实现:

perl -le'@l=map{chomp;$m=length if$m<length;$_}<>;for$i(0..$m-1){print map substr($_,$i,1)||" ",@l}' 
相关问题