2011-08-28 16 views
5

I tienen una serie de número desconocido de palabras, con una longitud max desconocido. necesito para convertirlo en otra matriz, básicamente, convirtiéndolo en una matriz columna de la palabra. por lo que con esta matriz original:Cómo convertir una serie de palabras en una matriz que contiene los caracteres de las palabras en orden?

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

La matriz resluting sería:

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

En realidad voy a tener este:

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

tengo que hacerlo con el fin de hacer una tabla, y estas palabras son los encabezados de la tabla. espero haber sido claro, y aprecio la ayuda que está dispuesto a dar.

he probado con la función de división, pero no dejo de mezclarlo ...

EDIT: Hola a todos, gracias por todos los consejos y sugerencias! Aprendí mucho de todos ustedes, por lo tanto, el voto popular. Sin embargo, me encontré con la respuesta de tchrist más conveniente, tal vez porque provienen de una C, C# fondo ... :)

Respuesta

5

tengo un viejo programa que hace esto. Tal vez se puede adaptar:

$ cat /tmp/a 
first 
base 
Thelongest12 
justAWORD4 

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

Aquí está la fuente:

$ 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 para el enfoque funcional, como de costumbre, el más conciso – 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

Se puede hacer fácilmente mediante este sencillo de una sola línea:

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