1

我想开始一个数组哈希并打印出值。我试过这个:

#!/usr/bin/perl
use strict;
use warnings;

my %hash = (
    one=> [ 'a', 'b', 'c', ],
    two => [ 'd', 'e', 'f', ],
    three => [ 'g', 'h', 'i', ],
);


foreach my $number (keys %hash) {
    print "Array: $number = ";
    foreach (@{$hash{$number}}) {
        print "$_\t\n";
    }
}

Array: three = g    
h   
i   
Array: one = a  
b   
c   
Array: two = d  
e   
f   

但我想要:

Array1 a b c 
Array2 d e f
Array3 g h i

谁能帮我吗?

4

4 回答 4

1

尝试这个:

#!/usr/bin/perl -w
use strict;

my %hash = (
    array1 => [ 'a', 'b', 'c', ],
    array2 => [ 'd', 'e', 'f', ],
    array3 => [ 'g', 'h', 'i', ],
);

foreach my $key (sort keys %hash) { 
    print "Array: $key = ";
    foreach ( @ {$hash{$key} } ) {
        print "$_\t"; # Separate values by `tab`
    }
    print "\n"; # This newline was in the wrong loop in your code
}

输出:

Array: array1 = a   b   c   
Array: array2 = d   e   f   
Array: array3 = g   h   i
于 2013-08-30T09:11:23.030 回答
1

这里,$number是 的一个元素keys %hash

foreach my $number (keys %hash) {

并且keys %hash,明智地,是%hash: 包含“一”、“二”和“三”的字符串的键。如果您想使用数字作为键,您可以:

my %hash = (
    1 => [ 'a', 'b', 'c', ],
    2 => [ 'd', 'e', 'f', ],
    3 => [ 'g', 'h', 'i', ],
);

这将纠正您的部分问题。另一部分是插入换行符的位置:

foreach (@{$hash{$number}}) {
    print "$_\t\n";
}

反而:

foreach (@{$hash{$number}}) {
    print "\t$_";
}
print "\n";

另请注意,我将制表符放在元素之前。

于 2013-08-30T09:18:06.960 回答
1

您的问题是您在此处的每个值之后打印一个制表符和一个换行符:

foreach (@{$hash{$number}}) {
    print "$_\t\n";
}

我猜你想用制表符分隔值,并希望在末尾有一个换行符。

我们可以使用该join功能。它需要一个分隔符和一个列表,然后将列表中的所有项目与您的分隔符连接起来:

 join "-", 1, 2, 3;  # "1-2-3"

所以代替那个内部循环,你可以写

print "Array: $number = ", join("\t", @{ $hash{$number} } ), "\n";
于 2013-08-30T09:18:23.380 回答
1
use strict;
my %hash = (
    Array1 => [ 'a', 'b', 'c', ],
    Array2 => [ 'd', 'e', 'f', ],
    Array3 => [ 'g', 'h', 'i', ],
);

for my $key (sort keys %hash) {
    my $text = join " ", @{$hash{$key}};
    print $key, " ",  $text, "\n";
}
于 2013-08-30T09:20:38.420 回答