如何缩短此代码?

时间:2014-03-27 16:17:48

标签: perl

如何缩短以下代码(可能还有其他循环或其他想法 - 不是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";

4 个答案:

答案 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;