UPDATE:
基礎上討論在this question的結果,這取決於你的意圖/什麼構成「不使用循環」的標準,低於map
基礎的解決方案(見「選項#1)可能是最簡明的解決方案,只要你不consi一個循環(答案的簡短版本是:就實現/性能而言,它是一個循環,從語言理論的角度來看,這不是一個循環)。
假設你不關心你是否獲得「3」或「索尼」作爲答案,你可以不用在一個簡單的情況下一個循環,通過構建一個正則表達式用「或」從陣列邏輯(|
),如下所示:Sony
正則表達式將會(一旦變量$combined_search
由Perl的插值)TA:
my @strings = ("Canon", "HP", "Sony");
my $search_in = "Sony's Cyber-shot DSC-S600";
my $combined_search = join("|",@strings);
my @which_found = ($search_in =~ /($combined_search)/);
print "$which_found[0]\n";
從我的測試運行的結果關於表格/(Canon|HP|Sony)/
這就是你想要的。
這將無法正常工作,則如果任何字符串包含regex的特殊字符(如|
或)
) - 在這種情況下,你需要逃避他們
注意:我個人認爲這個有點作弊,因爲爲了實現join()
,Perl本身必須在中介者的某個地方做一個循環。因此,這個答案可能無法滿足您希望保持無循環的願望,這取決於您是否想要避免出於性能考慮的循環,以及使代碼更簡潔還是更短。
P.S.要獲得「3」而不是「索尼」,你將不得不使用循環 - 要麼以一種明顯的方式,通過在它下面的循環中進行1次匹配;或者使用一個庫來避免你自己編寫循環,但會在調用下面有一個循環。
我會提供3種替代解決方案。
#1選項: - 我的最愛。使用 「地圖」,我個人仍然認爲一個循環:
my @strings = ("Canon", "HP", "Sony");
my $search_in = "Sony's Cyber-shot DSC-S600";
my $combined_search = join("|",@strings);
my @which_found = ($search_in =~ /($combined_search)/);
print "$which_found[0]\n";
die "Not found" unless @which_found;
my $strings_index = 0;
my %strings_indexes = map {$_ => $strings_index++} @strings;
my $index = 1 + $strings_indexes{ $which_found[0] };
# Need to add 1 since arrays in Perl are zero-index-started and you want "3"
#2選項:使用的背後隱藏着一個很好的CPAN庫方法的循環:
use List::MoreUtils qw(firstidx);
my @strings = ("Canon", "HP", "Sony");
my $search_in = "Sony's Cyber-shot DSC-S600";
my $combined_search = join("|",@strings);
my @which_found = ($search_in =~ /($combined_search)/);
die "Not Found!"; unless @which_found;
print "$which_found[0]\n";
my $index_of_found = 1 + firstidx { $_ eq $which_found[0] } @strings;
# Need to add 1 since arrays in Perl are zero-index-started and you want "3"
#3選項:這裏有明顯的循環方式:
my $found_index = -1;
my @strings = ("Canon", "HP", "Sony");
my $search_in = "Sony's Cyber-shot DSC-S600";
foreach my $index (0..$#strings) {
next if $search_in !~ /$strings[$index]/;
$found_index = $index;
last; # quit the loop early, which is why I didn't use "map" here
}
# Check $found_index against -1; and if you want "3" instead of "2" add 1.
Perl並不是真正的魔法。這只是Arthur C. Clarke先進技術的一個例子,與魔法無法區分:) 然後,我認爲這個整體格式的東西是我個人認爲的巫術:( – DVK 2010-06-11 02:30:25
最近怎麼樣?如果你需要做一些事情在元素列表中,你必須以某種方式循環它們,你可能不會明確地使用'for'或'while',但是在一天結束時,即使是最深奧的解決方案也會使用某種類型的循環。 – 2010-06-11 18:13:59
@kemp - 最近有沒有其他的反循環問題,我錯過了? – DVK 2010-06-12 13:32:59