【问题标题】:Compare Arrays and Delete Arrays比较数组和删除数组
【发布时间】:2014-02-13 14:31:04
【问题描述】:

我有以下三个集合(数组),我需要在( (A-B)UC ) 上执行这样的操作。 有人可以在 Perl 中有这样的逻辑吗? 这是我的代码,我可以检查是否是 A 的 B 子集,但我无法执行“A-B”:

my @array = (MAJOR,MINOR,MM,DD,YY);
my @exclude = (MM,MINOR,YY);
my @include = (LICENSE,VALID);
foreach (@exclude) {
if ( $_ ~~ @array ) {
print "\n $_ is defined in variables and it will be excluded \n";
@array = grep {!/\$_/} @array;
print "@array \n";
}
else {
print "\n $_ is not defined under variables please check the files \n";
exit 100;
}
}
foreach (@array){
print "$_ \n";
}

我怀疑我的 grep 操作逻辑有问题,即删除操作。

【问题讨论】:

    标签: arrays perl compare


    【解决方案1】:

    grep 的一个问题是外部循环中的$_ 在 grep 块内被重新定义为@array 的每个元素。你需要有不同的名字。此外,您的正则表达式缺少锚点;但是,不要使用正则表达式,而是使用字符串不等式。试试这个:

    my @array = qw(MAJOR MINOR MM DD YY);
    my @exclude = qw(MM MINOR YY);
    my @include = qw(LICENSE VALID);
    foreach my $e (@exclude) {
      if ( $e ~~ @array ) {
        print "\n $e is defined in variables and it will be excluded \n";
        @array = grep {$e ne $_} @array;
        print "@array \n";
      } else {
        print "\n $e is not defined under variables please check the files \n";
        exit 100;
      }
    }
    

    【讨论】:

      【解决方案2】:

      使用严格和警告来提醒您注意 perl 中的许多陷阱。

      哈希是在 perl 中表示集合的最自然方式。

      use strict;
      use warnings;
      my @array = ('MAJOR','MINOR','MM','DD','YY');
      my @exclude = ('MM','MINOR','YY');
      my @include = ('LICENSE','VALID');
      
      my %set;
      # add @array to set
      @set{@array} = ();
      # remove @exclude
      delete @set{@exclude};
      # add @include
      @set{@include} = ();
      # array of elements resulting
      my @result = sort keys %set;    
      

      【讨论】:

        【解决方案3】:

        您可以使用set 来执行此类操作。我使用了一个非标准模块Set::Scalar 来帮助我:

        #!/usr/bin/env perl
        
        use warnings;
        use strict;
        use Set::Scalar;
        
        my @array = qw(MAJOR MINOR MM DD YY);
        my @exclude = qw(MM MINOR YY);
        my @include = qw(LICENSE VALID);
        
        my $array_set = Set::Scalar->new(@array);
        my $exclude_set = Set::Scalar->new(@exclude);
        my $include_set = Set::Scalar->new(@include);
        
        my $result = $array_set->difference($exclude_set)->union($include_set);
        
        use Data::Dumper;
        
        print Dumper @$result;
        

        像这样运行它:

        perl script.pl
        

        产生:

        $VAR1 = 'VALID';
        $VAR2 = 'MAJOR';
        $VAR3 = 'DD';
        $VAR4 = 'LICENSE';
        

        【讨论】:

        • 它是可用的,有没有办法使用标量操作比较两个数组。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-05
        • 2021-09-17
        • 1970-01-01
        相关资源
        最近更新 更多