2014-03-27 172 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等應該只用於轉換。 –