如何捕获和比较不同数组的值子集?

时间:2009-08-02 22:04:49

标签: perl arrays

我有10个数组,每个数组都包含相似类型的值。我想从每个数组中捕获这些值的子集(仅捕获数字),然后将其与来自其他数组的子集进行比较。而且,我想只在值中没有破折号的情况下从两个数组中捕获值的数字部分(即2EF =捕获'2'但如果是45F-则不捕获任何内容,转移到下一个值)。

_ DATA _

@ array1 =( - ,1EF,2DG,3GF,4F - , - ,.... 99GY);

@ array2 =( - ,1EF,2DF,3SD,4DE, - ,.... 99HK);

一次可以比较10个中的任意两个数组。所以,我已将它们存储在数组“@allarrays”中并循环进行比较。在下面的脚本中,我能够完美地捕获第一个数组的数字,但我无法比较第二个数组的数字。 $ digit1(对应于@ array1)的值被复制到$ digit2(对应于@ array2)。关于什么是错误的任何建议?

sub compareArrays {
    my @array = @_; #passes an array @allarray which has @array1, @array2 ...@array10
        for (my $p=0; $p<10; $p++){ # since total number of arrays is 10
            for (my $r=$p+1; $r<10; $r++){ #to compare arrays
            for (my $q=0; $q<$colsInArray; $q++){
                my $string1= $array[$p][$q];
                my $string2= $array[$r][$q];

                #array1
                    $string1=~ /(\d+)[A-Z]+/;
                my $digit1 = $1; #capture digit part of array value
                print "array1: $digit1\n"; #works fine, prints captured $digit1                                 
                #array2
                $string2=~ /(\d+)[A-Z]+/;
                my $digit2 = $1;
                print "array2: $digit2\n"; #does not capture the value in $digit2, instead copies $digit1

                if ($digit1 == $digit2){ 
                print "$digit1 : $digit2\n"; 
                }                 
            }

            }
        }
}

_ 更新 _ 将compareArrays称为:

&compareArrays(@allarrays);

2 个答案:

答案 0 :(得分:1)

当我使用您的测试代码时,它会捕获$ digit2中的值。您可以向我们展示您如何调用compareArrays。

在访问$ 1之前,您应该检查正则表达式是否匹配;如果正则表达式失败,将从上一场比赛中遗留1美元。您没有任何内容可以跳过包含 - 的值。 假设数字始终位于开头,后面只有大写字母,您可以通过说

来组合这两个数字
my ($digit1) = $string1 =~ /^([0-9]+)[A-Z]+\z/ or next;

答案 1 :(得分:1)

为了将数组传递给子例程,必须通过引用传递:

compareArrays(\ @ allarrays);