我有一组可变大小的字符串,例如:
AAA23
AB1D1
A1BC
AAB212
我的目标是按字母顺序和为COLUMNS收集的独特字符,例如:
第一栏: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);
答案 0 :(得分:2)
您正在做的是旋转阵列。它不需要哈希或任何东西的哈希,只需要另一个数组。令人惊讶的是,List :: Util和List :: MoreUtils都没有提供。这是一个简单的测试实现。我假设你想要填充空格的短条目,以便列出来正确。
#!/usr/bin/perl
use strict;
use warnings;
use Test::More;
use List::Util qw(max);
my @Things = qw(
AAA23
AB1D1
A1BC
AAB212
);
sub rotate {
my @rows = @_;
my $maxlength = max map { length $_ } @rows;
my @columns;
for my $row (@rows) {
my @chars = split //, $row;
for my $colnum (1..$maxlength) {
my $idx = $colnum - 1;
$columns[$idx] .= $chars[$idx] || ' ';
}
}
return @columns;
}
sub print_columns {
my @columns = @_;
for my $idx (0..$#columns) {
printf "Column %d: %s\n", $idx + 1, $columns[$idx];
}
}
sub test_rotate {
is_deeply [rotate @_], [
"AAAA",
"AB1A",
"A1BB",
"2DC2",
"31 1",
" 2",
];
}
test_rotate(@Things);
print_columns(@Things);
done_testing;
答案 1 :(得分:0)
您可以使用
对代码中%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,当你看到单词unique时,总会想到哈希!
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