сопоставлять элементы в одной позиции 2 массивов в perl - PullRequest
1 голос
/ 13 ноября 2011

У меня есть 2 массива

@a = qw/ A B C D E     /;
    @b = qw/ B B C       A /;    

Мне нужно проверить, появляются ли один и тот же элемент в одной и той же позиции каждого массива

    e.g. 

    $a[2] = "B";
    $b[3] = "C";

, если это так, подсчитайте, сколько раз это произошлоэто нужно игнорировать любые пустые элементы

    e.g.

    $a[6] =  ;
    $b[6] =  ;

комментарии наиболее ценятся Мне нравится понимать скрипт.

Я пытался пересечь eq == cmp и т. д., но я могуне совсем понял и не совсем уверен

Заранее спасибо.

Вот мой код:

#!/usr/bin/perl -w

my @a = <FILE1>;
my @b = <FILE2>;

$occurs = 0; #Using eq
foreach my $letter (@a) {
    if (my $letter2 (@a) eq $letter) { #Syntax error here
        $count ++;
    }
} #syntax error here

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

Для вашей проблемы, как указано, я бы использовал что-то вроде этого:

$happened += $a[$_] eq $b[$_] for 0 .. $#a;

Чтобы игнорировать пустые элементы, вы можете также проверить defined($a[$_]) и length($a[$_]).

Тем не менее,

qw/ B B C       A /

совпадает с qw/B B C A/, поэтому пустые элементы не вводятся. Кроме того, в вашем примере для элемента тот же показаны различные элементы в разных позициях.

1 голос
/ 13 ноября 2011

Определение blank здесь необходимо уточнить.Это пустая строка?undef значение?Пробелы?

Я предполагаю, что любой элемент без непробельных символов, например, blank в примере ниже, показывает, как это можно сделать с помощью конструкции each @array:

use strict;
use warnings;

my @a = ( 'A', 'B', 'C', 'D', 'E', ' ', ' ' );  # Can't use qw/ / 'cos
my @b = ( ' ', 'B', 'C', ' ', ' ', ' ', 'A' );  # it ignores whitespace

my %count;                                      # Store results in a hash

while ( my ( $index, $value ) = each @a ) { # Loop over index & value together

    my $otherValue = $b[$index];            # Get the other value in @b

    next unless $value =~ /\S/ and $otherValue =~ /\S/;  # Skip if 'blank'

    $count{$value}++ if $value eq $otherValue; # Increment counter for that value
}

print "$_ : $count{$_}\n" for keys %count;     # B : 1
                                               # C : 1

# Find out total

use List::Util 'sum';                          # No need to reinvent wheel
print "Sum : ", sum ( values %count ), "\n";   # Sum : 2
...