【问题标题】:How can I compare different elements of array in Perl?如何比较 Perl 中数组的不同元素?
【发布时间】:2010-11-07 01:53:11
【问题描述】:

我是这个领域的新手。所以请对我放轻松。我有两个数组:

@array1 = ("ABC321", "CDB672", "PLE89",....);

@array2 = ("PLE89", "ABC678", "LMD789",...);

我想比较这两个不同数组的元素。但是,我只想用字母匹配字母。例如,如果比较数组,$array[2] 元素 (PLE) 应该与 $array2[0] (PLE) 匹配,同样$array1[0] (ABC) 应该与 $array[1] (ABC) 匹配。我可以一次做一个,但不能同时比较两个数组的所有元素(即循环数组)。

    my ($value1)= ($array[2]=~ /([A-Z]+)[0-9]+/);
    print "Value1: $value1 \n";
    my ($value2)= ($array[0]=~ /([A-Z]+)[0-9]+/);
    print "Value2 : $value2 \n";
    if ($value1 eq $value2){
            print " length \n";
    }

关于如何同时为两个数组设置循环的任何建议?

【问题讨论】:

  • 你到底想从最后的print " length \n"; 语句中得到什么?你想打印单词长度还是在某些东西上使用长度函数?
  • @Telemachus:这个想法不是打印长度。如果满足条件(来自两个数组中不同元素的字母匹配),这就是我写的要打印的任何单词。我只想比较数组的所有元素并存储/输出字母(例如 ABC、PBL)匹配的元素。
  • @Birdy:我不认为你不希望每次匹配到相同的信息,因为它不会告诉你太多。也就是说,当您获得匹配项时,您会一遍又一遍地看到“长度”、(下一个匹配)“长度”、(下一个匹配)“长度”,但您不知道哪些项目匹配。如果您查看所有解决方案,它们的共同点是消息试图告诉用户什么匹配什么。

标签: perl arrays loops


【解决方案1】:

与语言无关的建议是首先对两个数组进行排序(应该花费你 O(n lg(n)),然后在线性时间内与两个迭代器进行比较。 如果性能不是问题,只需保持简单并进行成对比较的二次数。 在排序的同时你也可以把数字去掉。

【讨论】:

    【解决方案2】:

    您可以使用哈希作为查找设备并获得O(m+n) 解决方案(其中m 是array1 的长度,n 是array2 的长度)。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my @array1 = qw(ABC321 CDB672 PLE89);
    my @array2 = qw(PLE89  ABC678 LMD789);
    
    my %seen;
    
    for my $item (@array1) {
        die "not a valid item: $item"
            unless my ($key) = $item =~ /([A-Z]+)/;
    
        #we are using an array to hold the items in case
        #the same key shows up more than once in an array
        #this code can be simpler if you can guarantee 
        #that the keys are unique
        push @{$seen{$key}}, $item;
    }
    
    for my $item (@array2) {
        die "not a valid item: $item"
            unless my ($key) = $item =~ /([A-Z]+)/;
        if (exists $seen{$key}) {
            print "$item is in array1, it matches @{$seen{$key}}\n";
        } else {
            print "$item is not in array1\n";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      相关资源
      最近更新 更多