Как превратить массив слов в массив, содержащий символы слов по порядку? - PullRequest
5 голосов
/ 28 августа 2011

У меня есть массив с неизвестным количеством слов, с неизвестной максимальной длиной. Мне нужно преобразовать его в другой массив, в основном превратив его в массив слов столбца. так с этим оригинальным массивом:

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

Результирующий массив будет:

@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

Мне нужно сделать это, чтобы составить таблицу, и эти слова являются заголовками таблицы. Я надеюсь, что прояснил себя и благодарен за помощь, которую вы готовы оказать.

Я пробовал это с функцией разделения, но я продолжаю портить ...

EDIT: Привет всем, спасибо за все советы и предложения! Я многому научился у всех вас, отсюда и упор. Тем не менее, мне показалось, что ответ Триста более удобен, возможно, потому, что я пришел из c, c # фона ...

Ответы [ 4 ]

7 голосов
/ 28 августа 2011
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;
5 голосов
/ 28 августа 2011

У меня есть старая программа, которая делает это.Может быть, вы можете адаптировать его:

$ 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 - tchrist@perl.com

$/ = '';

# 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";
}
1 голос
/ 28 августа 2011
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 голосов
/ 30 августа 2011

Это легко сделать с помощью простого однострочного:

perl -le'@l=map{chomp;$m=length if$m<length;$_}<>;for$i(0..$m-1){print map substr($_,$i,1)||" ",@l}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...