我有陣列@hon_data。如果陣列的任何元素是已知值串列之一,我回傳零。
for my $hon_field (@hon_data) {
if($hon_field ne 'B' and $hon_field ne 'S' and $hon_field ne 'G' and
$hon_field ne 'D' and $hon_field ne 'L') {
return 0;
}
}
要檢查的值的數量正在增加,因此這種方法的管理變得越來越復雜。有沒有辦法用陣列中的值做到這一點?
my @results =("B","G","S","D","N","L");
my @results2 = ("A","G","S","D","N","L");
sub uniq {
my %seen;
grep { !$seen{$_} } @_;
}
my @unique = uniq(@results, @results2);
在 result2 A 是唯一值,它應該只回傳 A 但是這段代碼不起作用。
uj5u.com熱心網友回復:
您在問如何用動態回圈替換硬編碼回圈。以下是可以做到這一點的一種方法:
for my $hon_field ( @hon_data ) {
for my $ok (qw( B S G D L )) {
if ( $hon_field ne $ok ) {
return 0;
}
}
}
那好多了。但是如果元素是字串,則可以用哈希查找替換內部回圈。
my %ok = map { $_ => 1 } qw( B S G D L );
for my $hon_field ( @hon_data ) {
if ( !$ok{ $hon_field } ) {
return 0;
}
}
這也可以寫成:
use List::Util qw( any );
my %ok = map { $_ => 1 } qw( B S G D L );
return 0 if any { !$ok{$_} } @hon_data;
可以使用類似的方法來查找集合的差異。
my %ok = map { $_ => 1 } qw( B S G D L );;
my @diff = grep { !$ok{ $_ } } @hon_data; # diff = hon_data - { B, S, G, D, L }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528214.html
標籤:perl
下一篇:在perl中使用變數呼叫sed
