2011-08-28 17 views
5

Ho una matrice di numero sconosciuto di parole, con una lunghezza massima sconosciuta. Ho bisogno di convertirlo in un altro array, in pratica trasformandolo in un array di parole in colonna. così con questo array originale:Come trasformare una matrice di parole in una matrice contenente i caratteri delle parole in ordine?

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

La matrice resluting sarebbe:

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

realtà mi avrà questo:

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

ho bisogno di farlo, al fine di fare un tabella, e queste parole sono le intestazioni della tabella. Spero di essere stato chiaro e di apprezzare l'aiuto che siete disposti a dare.

ho provato con la funzione split, ma continuo a scompigliare in su ...

EDIT: Ciao a tutti, grazie per tutti i consigli e suggerimenti! Ho imparato molto da tutti voi quindi l'upvote. Comunque ho trovato la risposta di tchrist più comoda, forse perché provengo da uno sfondo c, C# ... :)

risposta

5

Ho un vecchio programma che fa questo. Forse si può adattare:

$ cat /tmp/a 
first 
base 
Thelongest12 
justAWORD4 

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

Ecco la fonte:

$ 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 per l'approccio funzionale, come al solito il più 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

Si può essere fatto facilmente da questo semplice one-liner:

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