Как захватить и сравнить подмножество значений из разных массивов? - PullRequest
0 голосов
/ 03 августа 2009

У меня есть 10 массивов, каждый из которых состоит из значений одинакового типа. Я хочу захватить подмножество этих значений (захватить только цифры) из каждого массива, а затем сравнить его с подмножеством из другого массива. А также, я хочу захватить числовую часть значений из обоих массивов, только когда в значении нет тире (т. Е. 2EF = capture '2', но если 45F-, то ничего не захватывать, перейти к значение).

_ ДАННЫЕ _

@ 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 ]

1 голос
/ 31 марта 2011

Чтобы передать массив в подпрограмму, вы должны передать по ссылке:

compareArrays (\ @ allarrays);

1 голос
/ 03 августа 2009

Когда я использую ваш тестовый код, он фиксирует значение в $ digit2. Вы можете показать нам, как вы вызываете CompareArrays.

Вы должны проверить, соответствует ли регулярное выражение перед доступом к $ 1; Если регулярное выражение не удалось, $ 1 останется от предыдущего матча. У вас нет ничего, чтобы пропустить значения, содержащие -. Предполагая, что цифры всегда в начале, за которыми следуют только заглавные буквы, вы можете объединить обе цифры, сказав

my ($digit1) = $string1 =~ /^([0-9]+)[A-Z]+\z/ or next;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...