Perl 相邻打印哈希的键和值

Perl 相邻打印哈希的键和值,perl,hash,Perl,Hash,我有一个像这样的杂烩 my %results = ( 'Ende Deaktiviere PKonten' => [ '31.05.2018 03:28:33', '01.06.2018 03:54:18', ], 'Ende Monatswechsel P-Konten' => [

我有一个像这样的杂烩

my %results = (
    'Ende Deaktiviere PKonten' => [
                                      '31.05.2018 03:28:33',
                                      '01.06.2018 03:54:18',
    ],
    'Ende Monatswechsel P-Konten' => [
                                         '31.05.2018 03:34:24',
                                         '01.06.2018 04:29:05',
    ]
);
我想用以下格式打印:

'Ende Deaktiviere PKonten' 'Ende Monatswechsel P-Konten' 
'31.05.2018 03:28:33'       '31.05.2018 03:34:24'
'01.06.2018 03:54:18'       '01.06.2018 04:29:05'
有人能帮我做这个吗

我试过这个:

foreach my $key (keys %results) {
            $N = scalar @{ $results{$key} };

            for my $i (0..($N-1)) {
                    print "i= $i , @{ $results{$key} }[$i]" ;
                    print "\n";
            }
print "\t";
}
输出

31.05.2018 03:37:47
01.06.2018 04:53:44
02.06.2018 03:37:14
07.06.2018 03:21:04
08.06.2018 03:40:04
31.05.2018 03:37:30
01.06.2018 04:53:23
02.06.2018 03:36:58
07.06.2018 03:20:51
2018年6月8日03:39:51

您可以尝试:

say join "\t", map {"'$_'"} keys %results;

my $N = scalar @{ $results{ (keys %results)[0] } };
for my $i (0..($N - 1)) {
    my @row;
    for ( keys %results ) {
        push @row, $results{$_}[$i];
    }
    say join "\t", map {"'$_'"} @row;
}

这应该是你想要的。首先打印键,然后从每个数组中一次打印一个数组值:

use strict;
use warnings;

my $hash = {
    'Ende Deaktiviere PKonten' => [
        '31.05.2018 03:28:33',
        '01.06.2018 03:54:18',
    ],
    'Ende Monatswechsel P-Konten' => [
        '31.05.2018 03:34:24',
        '01.06.2018 04:29:05',
    ]
};
my $arrLingth = @{$hash->{(keys %$hash)[0]}};
foreach my $key(keys %$hash) {
    printf "%25s", $key . "\t";
}
print "\n";
for(my $i=0; $i<$arrLingth; $i++) {
    foreach my $key(keys %$hash) {
        printf "%25s", $hash->{$key}->[$i] . "\t";
    }
    print "\n";
}
使用严格;
使用警告;
我的$hash={
'Ende Deaktivier PKonten'=>[
'31.05.2018 03:28:33',
'01.06.2018 03:54:18',
],
“Ende Monatswechsel P-Konten”=>[
'31.05.2018 03:34:24',
'01.06.2018 04:29:05',
]
};
我的$arrLingth=@{$hash->{(键%$hash)[0]};
foreach my$密钥(密钥%$hash){
printf“%25s”,$key.\t;
}
打印“\n”;
对于(my$i=0;$i{$key}->[$i]。“\t”;
}
打印“\n”;
}

虽然我可能会因为回答了一个糟糕的问题而被否决,但我的解决方案如下

正如我在“提示”中所描述的,这构建了一个列信息数组,并在打印时对其进行转置。大部分代码涉及到对
printf
格式的泛化,并且可能要短得多

请注意,这些列将不按特定顺序排列,因为散列本质上是无序的

使用严格;
使用“全部”警告;
使用列表::Util'max';
我的%results=(
“Ende Deaktivier PKonten”=>,
“Ende Monatswechsel P-Konten”=>[“31.05.2018 03:34:24”,“01.06.2018 04:29:05'],
);
{
my@columns=map[$\,@{$results{$\}],键%results;
my$w=最大映射长度,映射@$\u,@列;
my$imax=max map$#$\ux,@列;
my$fmt=join(“”,(“%-${w}s”)x@columns)。“\n”;
对于我的$i(0..$imax){
printf$fmt,map$\->[$i]/'',@columns;
}
}
输出
Ende Monatswechsel P-Konten Ende deaktivier PKonten
31.05.2018 03:34:24         31.05.2018 03:28:33        
01.06.2018 04:29:05         01.06.2018 03:54:18        

到目前为止,您尝试了什么?我不希望有人做我的工作,为什么问一个简单的问题是“卑鄙”的。我是perl新手,如果我知道如何做,我不会问对的?!@Unsal:那么您希望得到什么样的答案呢?我并不是唯一一个这样做的人;很多人,也许是大多数人,对只包含“我该怎么做"完全没有代码。知道没有Perl是通过学习它来解决的,而不是让别人来做你的工作。但是这个问题不是Perl独有的:解决它,你喜欢的语言并移植它。那么你期待什么样的答案呢?一个提示,而不是一个服务的解决方案提示:将列构建为行并转置矩阵。谢谢Andrey,它起了作用。Apprec谢谢你的帮助。当然,如果我知道如何开始,我会发布我自己的代码。非常感谢