Perl - хеш хэша и столбцов :( - PullRequest
5 голосов
/ 08 июля 2010

У меня есть набор строк с переменными размерами, например:

AAA23

AB1D1

A1BC

AAB212

Моя цель - иметь в алфавитном порядке и собирать уникальные символы для столбцов, такие как:

первый столбец: AAAA

второй столбец: AB1A

и так далее ...

На данный момент мне удалось извлечь сообщения через хэш хэшей.Но как я могу отсортировать данные?Могу ли я для каждого хэша хэша создать новый массив?

Большое спасибо за помощь!

Al

Мой код:

#!/usr/bin/perl

use strict;
use warnings;

my @sessions = (
    "AAAA",
    "AAAC",
    "ABAB",
    "ABAD"
);

my $length_max = 0;
my $length_tmp = 0;

my %columns;

foreach my $string (@sessions){

    my $l = length($string);

    if ($l > $length_tmp){
            $length_max = $l;
    }
}

print "max legth : $length_max\n\n";

my $n = 1;

foreach my $string (@sessions){

    my @ch = split("",$string);

    for my $col (1..$length_max){
        $columns{$n}{$col} = $ch[$col-1];
    }

    $n++;
}

foreach my $col (keys %columns) {

    print "colonna : $col\n";

    my $deref = $columns{$col};

    foreach my $pos (keys %$deref){
            print " posizione : $pos --> $$deref{$pos}\n";
    }

    print "\n";
}

exit(0);

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

То, что вы делаете, вращает массив.Ему не нужен хэш или что-то еще, просто другой массив.Удивительно, но ни List :: Util, ни List :: MoreUtils не предоставляют ни одного.Вот простая реализация с тестом.Я предположил, что вы хотите, чтобы короткие записи были заполнены пробелами, чтобы столбцы были правильными.

0 голосов
/ 08 июля 2010

Вы можете отсортировать вывод %columns в своем коде с помощью

foreach my $i (sort { $a <=> $b } keys %columns) {
  print join(" " => sort values %{ $columns{$i} }), "\n";
}

Это дает

A A A A 
A A A C 
A A B B 
A A B D

Но с использованием индексов в качестве хеш-ключей screams что вы должны использовать вместо этого массив, так что давайте сделаем это.Чтобы получить столбцы, используйте

sub columns {
  my @strings = @_;
  my @columns;

  while (@strings) {
    push @columns => [ sort map s/^(.)//s ? $1 : (), @strings ];
    @strings = grep length, @strings;
  }

  @columns;
}

Учитывая строки из вашего вопроса, он возвращает

A A A A
1 A A B
1 A B B
2 2 C D
1 1 3
2

Как видите, это не отсортировано и повторяет символы.В Perl, когда вы видите слово уникальное, всегда думайте о хешах!

sub unique_sorted_columns {
  map { my %unique;
        ++$unique{$_} for @$_;
        [ sort keys %unique ];
      }
      columns @_;
}

Если вы не против уничтожить информацию, вы можете columns сортировать и фильтровать дубликаты:

sub columns {
  my @strings = @_;
  my @columns;

  while (@strings) {
    my %unique;
    map { ++$unique{$1} if s/^(.)//s } @strings;
    push @columns => [ sort keys %unique ];
    @strings = grep length, @strings;
  }

  @columns;
}

Вывод:

A
1 A B
1 A B
2 C D
1 3
2
...