如何缩短以下代码(可能还有其他循环或其他想法 - 不是1-Line的所有内容),但保留当前的功能?
my $key = shift;
my $query = shift;
my $count = 0;
foreach my $ProteinDB (@DB) {
my $Set = $ProteinDB->{$key};
if($Set =~ /$query/) {
print RWS($ProteinDB->{'ID'}) . "\n";
$count++;
}
}
print "$count Hits Got Found...\n";
print "\n";
答案 0 :(得分:2)
这是一个只需要一行的解决方案:
my $key = shift; my $query = shift; my $count = 0; foreach my $ProteinDB (@DB) { my $Set = $ProteinDB->{$key}; if($Set =~ /$query/) { print RWS($ProteinDB->{'ID'}) . "\n"; $count++; } } print "$count Hits Got Found...\n"; print "\n";
大多数人更喜欢简单易读的代码,但有一些例外情况可以优化资源使用。
答案 1 :(得分:2)
我唯一能看到的是,如果您不再使用$ProteinDB->{$key}
,只需
next unless $ProteinDB->{$key} =~ /$query/;
...
但你也可以这样做:
foreach my $ProteinDB ( grep { $_->{ $key } =~ /$query/ } @DB ) {
print RWS($ProteinDB->{'ID'}) . "\n";
$count++;
}
这样你就可以缩小foreach循环中使用的急切列表。
答案 2 :(得分:1)
我不明白动机,但嘿嘿。
这是一种不同的方法 - 不是代码高尔夫球,当然,但仍然很可读。
my ($key, $query) = @_;
my $count = scalar
map { print(RWS($_->{ID} . "\n")); }
grep { $_->{$key} =~ /$query/ } @DB;
print "$count Hits Got Found...\n";
print "\n";
不完全等效,但除非您依赖@_
被shift
修改,否则它应该是相同的。
答案 3 :(得分:1)
假设这是一个子程序,我会写这样的东西
my ($key, $query) = @_;
my @wanted = grep { $_->{$key} =~ /$query/ } @DB;
print RWS($_->{ID}), "\n" for @wanted;
printf "%d Hits Got Found...\n\n", scalar @wanted;