2013-10-17 13 views
8

Ich habe ein sortiertes Array anzuzeigen:saubere Art und Weise ein Array in Drittel aufgeteilt und in einem Perl-Skript zB Benutzer

qw(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll) 

Gibt es eine einfache Art und Weise angezeigt wird es in drei Spalten, so dass

  1. erstes Drittel in der linken Spalte ist
  2. Mitte in mittleren Spalt dritte ist
  3. und zuletzt in der rechten Spalte dritte ist

Dies ist so, dass die Elemente angezeigt werden können, die auf dem Bildschirm anstatt über den Bildschirm laufen. zB

aaa eee iii 
bbb fff jjj 
ccc ggg kkk 
ddd hhh lll 

Ich habe versucht, Modul zu verwenden, aber es wird kompliziert und dachte, dass es eine elegante Lösung geben könnte. Letztendlich beabsichtige ich, es für etwas ähnlich wie select in bash zu verwenden.

Vielen Dank.

Antwort

8
use List::MoreUtils qw(part); 
my $num_rows = int(@a/3); 
my @aoa = map [ @a[@$_] ], part { $_ % $num_rows } 0..$#a; 
print("@$_\n") for @aoa; 

oder

use List::MoreUtils qw(part); 
my $num_rows = int(@a/3); 
my @aoa = part { $_ % $num_rows } 0..$#a; 
print("@a[ @$_ ]\n") for @aoa; 

oder

my $num_rows = int(@a/3); 
for my $row_num (0..$num_rows-1) { 
    print("@a[ map { $row_num + $num_rows*$_ } 0..2 ]\n"); 
} 

Versionen der das oben tun annimmt nicht @a% 3 == 0.

use List::MoreUtils qw(part); 
use POSIX   qw(ceil); 
my $num_rows = ceil(@a/3); 
my @aoa = map [ @a[@$_] ], part { $_ % $num_rows } 0..$#a; 
print("@$_\n") for @aoa; 

oder

use List::MoreUtils qw(part); 
use POSIX   qw(ceil); 
my $num_rows = ceil(@a/3); 
my @aoa = part { $_ % $num_rows } 0..$#a; 
print("@a[ @$_ ]\n") for @aoa; 

oder

use POSIX qw(ceil); 
my $num_rows = ceil(@a/3); 
for my $row_num (0..$num_rows-1) { 
    print("@a[ grep { $_ < @a } map { $row_num + $num_rows*$_ } 0..2 ]\n"); 
} 
+0

Dank ikegami, Ich mag Ihre letzte Lösung, für die andere 'ceil mit (@/3)' einer „möglichen unbeabsichtigten Interpolation“ auslöst, wenn Sie mit 'Verwendung strict' – David

+0

@ David, Diese Botschaft von Warnungen kommt, nicht streng, und mein Code produziert es nicht. Sie haben etwas (falsch) geändert, wenn Sie das haben. – ikegami

+0

nicht beschweren, jedenfalls bin ich wieder gegangen, um damit wieder zu spielen, und kann den Fehler, den ich sah, nicht neu erstellen, also keine Ahnung, wie ich es geschafft habe, es zu tun! :) – David

3

Hier ist meine Lösung, hoffe es hilft Ihnen.

use strict; 
use warnings; 

my @arr = ("aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg", "hhh", "iii", "jjj", "kkk", "lll"); 
my $size = @arr; 

my $column = 3; 

my $mod = $size/$column; 

my $i = $size; 
my $count = 0; 
while ($i > 0) { 
    my $k = $count; 
    while ($k < $size) { 
     print "$arr[$k]\t"; 
     $k += $mod; 
    } 
    print "\n"; 
    $count++; 
    $i -= $column; 
} 
+0

Dank Licht, ist hier ein paar Notizen über Ihre Lösung: Hinzufügen von zusätzlichen Elemente in das Array verursacht Elemente erscheinen am Ende einer Spalte und am Anfang der nächsten, führt das Hinzufügen längerer Elemente dazu, dass die Spalten die Ausrichtung verlieren – David

3
my @foo = qw(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll); 
my $rows = int((@foo+2)/3); 
my @row; 
$row[$_ % $rows][$_/$rows] = $foo[$_] for 0..$#foo; 
for my $row (@row) { 
    print join(' ', @$row), "\n"; 
} 
+0

Thanks esth, Hier sind einige Hinweise zu dieser Lösung: Zusätzliche Elemente werden durch Hinzufügen von ex gut behandelt tra Zeilen, Spalten werden nicht ausgerichtet, wenn die Elemente im Array nicht die gleiche Breite haben. – David

2

Eine weitere Option:

use strict; 
use warnings; 

my @a = qw(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll); 
my @aoa; 
push @{ $aoa[ $_ % 4 ] }, $a[$_] for 0 .. $#a; 
print "@{ $_ }\n" for @aoa; 
+0

Dank Kenosis, Hier einige Hinweise über Ihre Lösung: Extra Array-Elemente als eine andere Spalte links hinzugefügt, Spalten in einer Reihe aufstellen nicht, ob die Elemente im Array sind nicht die gleiche Breite – David

4

Nach dieser Frage zu lesen, ist es viel wie ein example sah, dass ich in der lesen Dokumente für Perl6::Form. (Was die Perl5 Implementierung ist)

use strict; 
use warnings; 
use Perl6::Form; 

my @array = qw'aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll'; 

print form 
    "{[[[[[:} {:[[[[:} {:[[[[[}", 
    \@array, \@array, \@array; 
aaa  eee  iii 
bbb  fff  jjj 
ccc  ggg  kkk 
ddd  hhh  lll 

Es wird nicht funktionieren, wie Sie es wollen, wenn eine der Saiten länger als seit sie zugeteilt.

... 
$array[-1] .= ' lllllll'; 
... 
aaa  fff  kkk 
bbb  ggg  lll 
ccc  hhh  lllllll 
ddd  iii 
eee  jjj 

Natürlich können Sie die gewünschte Breite vor dem Aufruf von form berechnen.

... 

use List::Util qw'max'; 

my $max_length = max 5, map length, @array; # at least 5 
my $TERMINAL_WIDTH = 80; 
my $number_of_cols = int($TERMINAL_WIDTH/($max_length+1)); 

my $single = '{:' . ('[' x ($max_length-4)) . ':} '; 

print $single, "\n\n"; # debug statement 

print form 
    $single x $number_of_cols, 
    (\@array) x $number_of_cols; 
{:[[[[[[[:} 

aaa   ccc   eee   ggg   iii   kkk 
bbb   ddd   fff   hhh   jjj   lll lllllll 
                      80^
0

4 LOC: Sehr einfach ... ENJOY

my @tokens = qw(aaa bbb ccc ddd eee fff ggg hhh iii jjj kkk lll); 
my $text = join(" ",@tokens); 
while($text =~ /[^ ]+ [^ ]+ [^ ]+/g) 
{ 
    print "$&\n"; 
} 

Samir

+0

Dank Samir, Hier ist meine Notizen über Ihre Lösung. Funktioniert gut, wenn es durch drei teilbar ist, aber wenn das nicht der Fall ist, fallen Extras. Spalten werden nicht ausgerichtet, wenn die Elemente im Array nicht die gleiche Breite haben. – David

Verwandte Themen