我有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);
答案 0 :(得分:1)
当我使用您的测试代码时,它会捕获$ digit2中的值。您可以向我们展示您如何调用compareArrays。
在访问$ 1之前,您应该检查正则表达式是否匹配;如果正则表达式失败,将从上一场比赛中遗留1美元。您没有任何内容可以跳过包含 - 的值。 假设数字始终位于开头,后面只有大写字母,您可以通过说
来组合这两个数字my ($digit1) = $string1 =~ /^([0-9]+)[A-Z]+\z/ or next;
答案 1 :(得分:1)
为了将数组传递给子例程,必须通过引用传递:
compareArrays(\ @ allarrays);