2011-08-28 25 views
5

Tôi có một số lượng từ không xác định, với độ dài tối đa không xác định. Tôi cần phải chuyển đổi nó thành mảng khác, về cơ bản biến nó thành một mảng từ cột. như vậy với mảng ban đầu này:Làm thế nào để biến một mảng các từ thành một mảng chứa các ký tự của các từ theo thứ tự?

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

Mảng resluting sẽ là:

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

Thật sự tôi sẽ có điều này:

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

tôi cần phải làm điều đó để làm cho một bảng, và những từ này là các tiêu đề của bảng. Tôi hy vọng tôi đã làm cho bản thân mình rõ ràng, và đánh giá cao sự giúp đỡ bạn sẵn sàng cung cấp.

Tôi đã thử nó với chức năng phân chia, nhưng tôi giữ rối tung nó lên ...

EDIT: Hi tất cả, cảm ơn vì tất cả những lời khuyên và gợi ý! Tôi đã học được khá nhiều từ tất cả các bạn do đó upvote. Tuy nhiên tôi thấy câu trả lời của tchrist thuận tiện hơn, có thể vì tôi đến từ c, C# background ... :)

Trả lời

5

Tôi có một chương trình cũ thực hiện việc này. Có lẽ bạn có thể thích ứng với nó:

$ cat /tmp/a 
first 
base 
Thelongest12 
justAWORD4 

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

Dưới đây là các nguồn:

$ 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 cho cách tiếp cận chức năng, như thường lệ nhất – 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

Nó có thể được thực hiện dễ dàng bằng cách này đơn giản một-liner:

perl -le'@l=map{chomp;$m=length if$m<length;$_}<>;for$i(0..$m-1){print map substr($_,$i,1)||" ",@l}' 
Các vấn đề liên quan