可以說我有2個陣列檢查,如果在陣列中的所有字符串都在第二陣列
my @one = ("one","two","three","four","five");
my @two = ("three","five");
我怎麼能告訴我們,如果第二陣列中的所有元素都在第一?
可以說我有2個陣列檢查,如果在陣列中的所有字符串都在第二陣列
my @one = ("one","two","three","four","five");
my @two = ("three","five");
我怎麼能告訴我們,如果第二陣列中的所有元素都在第一?
另一種方法,不知道它比ikegami的更好。仍然TIMTOWTDI
#!/usr/bin/env perl
use strict;
use warnings;
use List::Util qw/first/;
use List::MoreUtils qw/all/;
my @one = ("one","two","three","four","five");
my @two = ("three","five");
if (all { my $find = $_; first { $find eq $_ } @one } @two) {
print "All \@two found in \@one\n";
}
這實質上是@ Axeman的解決方案。智能匹配將比第一個更快,但它們都是O(M * N)。我猜你是O(M/2 * N)(平均來說,'first'只需要搜索一半數組),但'first'vs'~~'的性能會降低。 – Schwern
是的,正如我的文章可能已經表明的那樣,我從List開始::(更多)Util(s)路徑並將其公佈爲「完整性」;我不驚訝它不是「最好的」。儘管我的解決方案是在@ axemans之前發佈的,我聲稱他的本質與我的一樣:-P –
從5.10開始,智能匹配運算符會這樣做。
my $verdict = !grep { not $_ ~~ @one } @two;
my $verdict = all { $_ ~~ @one } @two;
另一種方式來解決。
my %hash;
undef @hash{@two}; # add @two to keys %hash
delete @hash{@one}; # remove @one from keys %hash
print !%hash; # is there anything left?
我從這個perlmonks node
可愛。我有點喜歡它。 –
use strict;
my @one = ("one","two","three","four","five");
my @two = ("three","five");
my %seen_in_one = map {$_ => 1} @one;
if (my @missing = grep {!$seen_in_one{$_}} @two) {
print "The following elements are missing: @missing";
} else {
print "All were found";
}
偷的念頭保證是獨一無二的集合元素的數組,或者你可以有例如'@One =(「一」,「一」, 「一」,「二」,「一」......)? – pilcrow
不保證是唯一的 – Bill
請澄清您的要求。你認爲'('a','a','b')的所有元素都在'('a','b')'中嗎? – pilcrow