Arrays 比较两个二维数组以匹配字符串

Arrays 比较两个二维数组以匹配字符串,arrays,perl,Arrays,Perl,我想比较两个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_sid

我想比较两个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与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]中的第一列

然后我需要计算出匹配的百分比

例如:


然后将匹配度最高的元素存储到另一个数组中(例如:@clknowed)

我认为您的问题可能过于复杂了,为了回答比较两个列表的原始问题,我有一个脚本,它将比较两个列表,并告诉您每个列表中不存在的内容。如果这正是你需要的让我知道,我们可以改变它,以适合您的使用。与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"; }
}

你能分享例外的输出吗。?我不能理解。您必须从哪个数组进行比较。为什么要使用
\u
展开并分配给数组。您正在搜索。您应该在所有Perl程序中始终使用
use strict
use warnings
,并使用
my
声明变量。你的变量名很难读懂,
strict
会告诉你什么时候有输入错误。为什么不直接使用散列呢?
$clkline[1][0] = $clkackline[0][1], 
$clkline[1][1] = $clkackline[0][2], 
$clkline[1][2] = $clkackline[0][3].
ux_prim_clk vs  uxd_prim_clkack will return 33.33%.
#!/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"; }
}