2014-03-27 122 views
0

如何缩短下面的代码(可能与其他循环或其他想法 - 而不是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

有什么问题你当前的代码?我看起来很好。 – ThisSuitIsBlackNot

+0

其优良和完美的工作,但我想使它更短...其代码线.. – user3075044

+2

你打代码高尔夫?如果没有,我不会担心你有多少行代码。您目前的代码很容易阅读,这更重要。 – ThisSuitIsBlackNot

回答

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; 
+0

非常感谢awsome工作! – user3075044

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"; 

大多数人都喜欢简单,可读的代码,有一些例外opimitize资源使用情况。

+0

感谢您的想法,但如果我的教授看到这个守则,会杀了我:D – user3075044

+0

:) ......就这样。 – Miller

+1

@ user3075044,这是你问的。 – ikegami

2

我能看到的唯一的事情是,如果你不打算再使用$ProteinDB->{$key},只是

next unless $ProteinDB->{$key} =~ /$query/; 
... 

但你也可以这样做:

foreach my $ProteinDB (grep { $_->{ $key } =~ /$query/ } @DB) { 
    print RWS($ProteinDB->{'ID'}) . "\n"; 
    $count++; 
} 

这样,你会正在缩小在foreach循环中使用的渴望列表。

+0

如果你把'grep'的结果放在一个列表中,你直接得到该列表的长度。除此之外,我也会提出这个建议。 – tripleee

1

我不明白动机,但嘿。

这是一种不同的方法 - 没有足够的代码golfy,当然,但仍然非常可读。

my ($key, $query) = @_; 
    my $count = scalar 
      map { print(RWS($_->{ID} . "\n")); } 
      grep { $_->{$key} =~ /$query/ } @DB; 
    print "$count Hits Got Found...\n"; 
    print "\n"; 

不完全等同,但除非你是在@_依靠由这些shift修改它应该工作一样。

+1

我不会考虑在'map'里面调用'print'来完全读取。 – ThisSuitIsBlackNot

+0

这是可读的,因为它仍然可以很容易理解。我同意'map's等应该只用于转换。 –