如何按数组顺序打印数组元素值?

时间:2014-07-27 17:49:10

标签: perl

如何按数组元素的顺序打印数组的值?

@ab= <DATA>;
print "@ab\n";
@a = qw(a b c d);
foreach $s(@ab){
   foreach $m (@a){
        $z =~m/$m/g;
        print "$z";
    }
}
__DATA__
d 43
a 5
b 24
d 4
a 12
b 54
c 11
a 1
d 1
a 32

在这个程序中给出输出,但我希望输出是

a 5
a 12
a 1
a 32
b 24
b 54
c 11
d 43
d 4
d 1

首先打印第一个数组元素的匹配值,然后打印第二个,依此类推。我怎么能这样做?

5 个答案:

答案 0 :(得分:5)

您的外部循环应该遍历@a并且超过@ab

my @ab= <DATA>;
my @a = qw(a b c d);

foreach my $m (@a) {
   foreach my $s (@ab) {
        print $s if $s =~ /^$m/;
    }
}
__DATA__
d 43
a 5
b 24
d 4
a 12
b 54
c 11
a 1
d 1
a 32

输出

a 5
a 12
a 1
a 32
b 24
b 54
c 11
d 43
d 4
d 1

答案 1 :(得分:2)

看起来您正在尝试按字母顺序对数组进行排序,但仅基于第一个字母。我认为这样做你想要的:

use strict;
use warnings;

print sort { (substr $a, 0, 1) cmp (substr $b, 0, 1) } <DATA>;

__DATA__
d 43
a 5
b 24
d 4
a 12
b 54
c 11
a 1
d 1
a 32

输出:

a 5
a 12
a 1
a 32
b 24
b 54
c 11
d 43
d 4
d 1

答案 2 :(得分:0)

对部分进行分组,然后打印

use strict;
use warnings;

my %group;
while (<DATA>) {
    my ($key) = split ' ';
    push @{$group{$key}}, $_;
}

for my $key (sort keys %group) {
    print @{$group{$key}};
}

__DATA__
d 43
a 5
b 24
d 4
a 12
b 54
c 11
a 1
d 1
a 32

输出:

a 5
a 12
a 1
a 32
b 24
b 54
c 11
d 43
d 4
d 1

答案 3 :(得分:0)

尝试:

@ab= <DATA>;                                                                    
@a = qw(a b c d);                                                               

print map { $tmp = $_; grep { $tmp eq (split(" ", $_))[0] } @ab } @a;           

__DATA__                                                                        
d 43                                                                            
a 5                                                                             
b 24                                                                            
d 4                                                                             
a 12                                                                            
b 54                                                                            
c 11                                                                            
a 1                                                                             
d 1                                                                             
a 32

<强>解释

  • map { ... } @a:循序遍历数组@a中的每个元素。
  • $tmp = $_:将$_函数map的当前值保存到变量$tmp
  • grep { $tmp eq (split(" ", $_))[0] } @ab:对于数组@ab中的每个元素,我们将其拆分为仅获取第一个字符,与当前$tmp值进行比较。如果相等,grep将返回该元素。

答案 4 :(得分:0)

这比Сухой27的回答更好:O(S)而不是O(ID * S)。

my @ids = qw( a b c d );

my %s_by_id;
while (my $s = <DATA>) {
    my ($id) = $s =~ /^(\S+)/
       or next;

    push @{ $s_by_id{$id} }, $s;
}

for my $id (@ids) {
   print @{ $s_by_id{$id} } if $s_by_id{$id};
}