Транспонируйте в жемчуге

Я начал изучать жемчуг и люблю испытывать новые вещи.

У меня есть некоторая проблема в обработке текста. У меня есть некоторый текст формы,

0 1 2 3 4 5 6 7 8 9 10

6 7 3 6 9 3 1 5 2 4 6

Я хочу транспонировать этот текст. Как, я хочу сделать строки как столбцы ответа столбцов как строки. Идентификатор там способ сделать это в жемчуге?

Спасибо всем.

14
задан jerrygo 15 July 2010 в 01:12
поделиться

4 ответа

Итак, это решение использует массив массивов, каждый вложенный массив это строка данных. Очень просто вы перебираете столбцы в каждом row и поместите их в другой массив массивов, используя столбец index как индекс, на который нужно поместить значение. Это имеет эффект переноса данных по вашему запросу.

#!/usr/bin/env perl

my @rows = ();
my @transposed = ();

# This is each row in your table
push(@rows, [qw(0 1 2 3 4 5 6 7 8 9 10)]);
push(@rows, [qw(6 7 3 6 9 3 1 5 2 4 6)]);

for my $row (@rows) {
  for my $column (0 .. $#{$row}) {
    push(@{$transposed[$column]}, $row->[$column]);
  }
}

for my $new_row (@transposed) {
  for my $new_col (@{$new_row}) {
      print $new_col, " ";
  }
  print "\n";
}

Это приводит к:

0 6 
1 7 
2 3 
3 6 
4 9 
5 3 
6 1 
7 5 
8 2 
9 4 
10 6
13
ответ дан 1 December 2019 в 10:17
поделиться

Конечно, есть, и Майк указал самый простой способ. Если вы учитесь, вы, вероятно, захотите написать свою собственную функцию?
Во-первых, вы хотите разделить каждую строку на пробелы, чтобы получить массив значений (или вставьте список слов в массив, как в ) Ответ Далтона ; в Perl всегда есть несколько способов сделать что-либо)
Затем для каждого элемента в массиве вы хотите распечатать его и его копию во втором массиве в той же строке. (Что вы будете делать, если один массив закончится раньше другого?)

Конечно, если вы хотите изучить Perl, вы также определенно захотите научиться использовать CPAN, так что все же стоит попробовать использовать Data: :Вращаться.

3
ответ дан 1 December 2019 в 10:17
поделиться

Вот схема одного из способов транспонирования данных. Работа с этим примером будет поучительной, потому что вам нужно будет использовать CPAN , вы узнаете о полезных модулях List :: Util и List :: MoreUtils , вы изучите основы сложных структур данных (см. perlreftut , perldsc и perllol ), и вы получите возможность использовать итератор в Perl.

use strict;
use warnings;
use List::MoreUtils qw(each_arrayref);

my @raw_data = (
    '0 1 2 3 4 5 6 7 8 9 10',
    '6 7 3 6 9 3 1 5 2 4 6',
);

my @rows = ... ; # Look up map() and split() to fill in the rest.
                 # You want an array of arrays.

my @transposed;  # You will build this in the loop below.

my $iter = each_arrayref(@rows);  # See List::MoreUtils documentation.

while ( my @tuple = $iter->() ){
    # Do stuff here to build up @transposed, which
    # will also be an array of arrays.
}
5
ответ дан 1 December 2019 в 10:17
поделиться
use strict;
# read the first line
my @labels = split ' ', <>;
# read and ignore the empty second line
<>;
# read the third line
my @values = split ' ', <>;
# transpose (I suppose you'll do more with the table than just printing it)
my %table = map { $labels[$_] => $values[$_] } 0..$#labels;
# print
foreach (@labels) {
    print "$_ $table{$_}\n";
}
2
ответ дан 1 December 2019 в 10:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: