如何将一个单词数组转换为包含单词字母顺序的字符数组?

5

我可以帮您进行翻译。以下是您需要翻译的内容:

我有一个单词数量未知、最大长度未知的数组。 我需要将其转换为另一个数组,基本上是将其变成一列单词数组。 因此,原始数组如下:

@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

我需要这样做以创建一个表格,这些单词是表头。希望我表达清楚了,感谢你愿意提供的帮助。
我尝试使用split函数,但总是搞砸...
编辑: 大家好,感谢所有的提示和建议!我从你们每个人身上学到了很多,因此点赞了。不过,我发现tchrist的答案更方便,也许是因为我来自C、C#背景... :)
4个回答

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;

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 - 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
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}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接