Сравните два 2D-массива, чтобы соответствовать строке - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу сравнить строку в двух 2D массивах, но размер не совпадает.Итак, я хочу сместить элемент в одном массиве, чтобы он соответствовал всем элементам в другом массиве, но у меня закончились представления о том, каким должен быть цикл.

Я впервые использую язык Perl.Я изучал язык c раньше.

#!/usr/intel/pkgs/perl/5.14.1/bin/perl

use Data::Dumper qw(Dumper);

@clk = (
'prescc_ux_aux_clk',
'prescc_ux_prim_clk',
'usb2_phy_side_clk',
'usb3_phy_side_clk',
'ux_prim_clk',
'ux_side_clk',
'ux_xtal_frm_refclk',
'uxd_aux_clk',
'uxd_pgcb_clk',
'uxd_prescc_aux_clk',
'uxd_prim_clk',
'uxd_side_clk',
'uxd_suspend_clk');

@clkack = (
'ccu_ux_xtal_frm_refclk_ack',
'ibbs_ux_prim_clkack',
'sbr_ux_side_clkack',
'uxd_aux_clkack',
'uxd_pgcb_clkack',
'uxd_prim_clkack',
'uxd_side_clkack');



foreach(@clk){
    @clkline = map {[split /_/,$_]} @clk;
    }
foreach(@clkack){
    @clkackline = map{[split /_/,$_]} @clkack;
    }

#print Dumper @clkline;

$match = 0;

$clkack_row = @clkackline; #no. of row in clkackline
$clk_row = @clkline;

for ($i=0; $i<$clkack_row; $i++){
    $clkackcolumn = @{$clkackline[$i]};

    for ($j=0; $j<$clkackcolumn; $j++){

        for ($m=0; $m<$clk_row; $m++){
            $clkcolumn = @{$clkline[$m]};

            for ($n=0; $n<$clkcolumn; $n++){
                if ($clkline[$i][$j] eq $clkacline[$m][$n]){
                    $match = $match + 1;
                    print "$match\n";
                }
            }
        }
    }
}

Я ожидаю, что он зациклит массив @clkackline и сравнит его с массивом @clkline.Если он соответствует, то он даст количество совпадений, следовательно, переменная $ match.

Отредактировано:

Мне нужно разделить его на '_', чтобы я мог разделить элементтолько словом внутри другого массива.Например:

$clk[0] = ux_prim_clk will result in;
$clkline[0][0] = ux,  $clkline[0][1] = prim, $clkline[0][2] = clk. 

Затем мне нужно сравнить элемент массива @clkackline по элементам, но в последовательном порядке.Например:

$clkline[0][0] = $clkackline[0][0], 
$clkline[0][1] = $clkackline[0][1], 
$clkline[0][2] = $clkackline[0][2]. 

Но другая проблема заключается в том, что мне нужно сравнить @clkline со всеми элементами в clkackline.Но так как размер будет ограничением, то мне нужно сместить @clkackline, чтобы он соответствовал @clkline, или наоборот.

Например: Первая проверка:

$clkline[1][0] = $clkackline[0][0], 
$clkline[1][1] = $clkackline[0][1], 
$clkline[1][2] = $clkackline[0][2].

Вторая проверка:

$clkline[1][0] = $clkackline[0][1], 
$clkline[1][1] = $clkackline[0][2], 
$clkline[1][2] = $clkackline[0][3].

Это просто пример, конечно, но вы можете видеть, что он мне нужен, чтобы удалить первый столбец в $ clkackline [0].

Тогда мне нужно посчитать, сколько процентов он будет соответствовать.

Например:

ux_prim_clk vs  uxd_prim_clkack will return 33.33%.

Затем сохранить элемент с наибольшим соответствием в другом массиве (например: @clknew)

1 Ответ

1 голос
/ 24 апреля 2019

Я думаю, что вы, возможно, слишком усложняете свою проблему, чтобы ответить на ваш первоначальный вопрос о сравнении двух списков. У меня есть сценарий, который сравнит два списка и скажет вам, чего не существует в каждом.Если этот экземпляр именно то, что вам нужно, дайте мне знать, и мы можем изменить его в соответствии с вашими потребностями.Как и в любой другой части Perl, вероятно, есть модуль, который сделает все это за вас.

#!/usr/bin/env perl

use strict;
use warnings;
use List::Util qw(any);

my @list1 = ('prescc_ux_aux_clk',
'prescc_ux_prim_clk',
'usb2_phy_side_clk',
'usb3_phy_side_clk',
'ux_prim_clk',
'ux_side_clk',
'ux_xtal_frm_refclk',
'uxd_aux_clk',
'uxd_pgcb_clk',
'uxd_prescc_aux_clk',
'uxd_prim_clk',
'uxd_side_clk',
'uxd_suspend_clk'
);

my @list2 = ('ccu_ux_xtal_frm_refclk_ack',
'ibbs_ux_prim_clkack',
'sbr_ux_side_clkack',
'uxd_aux_clkack',
'uxd_pgcb_clkack',
'uxd_prim_clkack',
'uxd_side_clkack'
);

print "\n==== LIST 1 TO LIST 2 COMPARISON, Does not exist in list 2 ====\n";
foreach my $first (@list1) { 
    if ( any { $_ eq $first} @list2) { next; }
        else { print $first . "\n"; }
}

print "\n==== LIST 2 TO LIST 1 COMPARISON, Does not exist in list 1 ====\n";
foreach my $first (@list2) { 
    if ( any {$_ eq $first} @list1) { next; }
        else { print $first . "\n"; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...