如何按数组元素的顺序打印数组的值?
@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
首先打印第一个数组元素的匹配值,然后打印第二个,依此类推。我怎么能这样做?
答案 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};
}