【问题标题】:How can I capture and compare subset of value from different arrays?如何捕获和比较来自不同数组的值子集?
【发布时间】:2022-02-10 03:31:20
【问题描述】:

我有 10 个数组,每个数组都包含相似类型的值。我想从每个数组中捕获这些值的子集(仅捕获数字),然后将其与另一个数组中的子集进行比较。而且,我只想在值中没有 dash 时才从两个数组中捕获值的数字部分(即 2EF = 捕获'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);

【问题讨论】:

  • @allarrays 设置为什么?由于您发布的内容基本上可以正常工作,因此您需要发布一个完整的可运行示例,包括初始化数组,以便我们查看哪些部分无法正常工作。

标签: perl arrays


【解决方案1】:

当我使用您的测试代码时,它确实捕获了 $digit2 中的值。您可以向我们展示您是如何调用 compareArrays 的。

您应该在访问 $1 之前检查正则表达式是否匹配;如果正则表达式失败,$1 将从上一场比赛中剩余。你没有任何东西可以跳过包含 - 的值。 假设数字总是在开头,后面只有大写字母,你可以通过说

来组合它们
my ($digit1) = $string1 =~ /^([0-9]+)[A-Z]+\z/ or next;

【讨论】:

  • @ysth:我评论了 $digit1 的所有内容,看看 $digit2 的正则表达式是否有效。在打印 $digit2 时,很明显正则表达式正在工作。但是,当我合并时,$digit2 与 $digit1 具有相同的值。我还更新了我如何调用 compareArrays。
  • @ysth: 我替换了 $string1=~ /(\d+)[A-Z]+/;我的 $digit1 = $1;用你上面写的。用你的表情替换它似乎解决了这个目的。但是,我不确定为什么?总之感谢! :)
【解决方案2】:

为了将数组传递给子程序,必须通过引用传递:

compareArrays(\@allarrays);

【讨论】:

    猜你喜欢
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2021-09-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多