【问题标题】:Perl multidimensional array searchPerl 多维数组搜索
【发布时间】:2011-06-26 01:23:42
【问题描述】:

我是 perl 新手,如果我的问题令人困惑,请见谅。

我有一个多维数组,它有 4 列和很多行。

需要搜索每行的第一个元素是否与变量匹配。

如果匹配,则连接第三列中的另一个变量。 如果没有匹配,则推送到同一个数组。

示例:

从其他循环/逻辑中获取 4 个不同的变量。

$var1$var2$var3$var3

并将它们推送到临时数组。

push @local,$var1,$var2,$var3,$var4;

在将它们推送到主数组之前,我需要检查 var1 是否已存在于 @new array 的 column1 中。如果存在,则连接同一行的第三列。

如果@new array的column1中不存在var1,则将@local2推送到@new

如果有人知道我是如何做到这一点的,请发布如何,我们将不胜感激。

谢谢:)

【问题讨论】:

  • 到目前为止您尝试了哪些操作,哪些操作失败了?您阅读了哪些关于“多维数组”以及 Perl 中“搜索数组”的文档?
  • 我尝试过使用 for 和 if 语句......并且每次都开始检查每一行。后面会有一行,但 if 条件与前面的行不匹配并继续添加它们。实际上,后者有一个真正的匹配。例如。在第 15 行会有匹配。但所有 14 行,条件变为 false,并添加条目。
  • 为什么不用你的代码更新你的问题呢?这样可以更轻松地为您提供帮助。
  • 输入和所需输出的示例会很有用。

标签: arrays perl hash multidimensional-array


【解决方案1】:

描述有点模糊,但这可能会满足您的需求。您需要的部分位于“CODE”标签之间。

#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;
use Data::Dumper;

my @new;    # Array where data will be stored

# Define test arrays that in turn will populate the four input variables
my @testvariables = (
    [qw/a1 a2 a3 a4/],
    [qw/b1 b2 b3 b4/],
    [qw/v1 v2 v3 v4/],
    [qw/c1 c2 c3 c4/],
    [qw/v1 v2 vv3 v4/],
    [qw/d1 d2 d3 d4/],
    [qw/b1 b2 bb3 b4/],
    [qw/v1 v2 vvv3 v4/]
    );

# Test different values for input varibles
foreach my $row_ref (@testvariables) {           # Each round gives us a new ref to an array
    my ($var1, $var2, $var3, $var4) = @{$row_ref};  # Update test variables
#-------------CODE--------------
    my $updated = undef;                            # Create/clear flag.
    foreach my $row_ref (@new) {                    # Loop though existing arrays in @new
        next unless ${$row_ref}[0] =~ /$var1/;     # Skip to next array in @new if $var1 does not match
        ${$row_ref}[2] .= "_$var3";               # $var1 matched as we got this far. Concat third element
        $updated = 1;                               # Flag that concat was performed
        last;                                      # No need to look for more matches in @new.
    }

    unless ($updated) {                         # If $var1 was not found in @new, append variables as array to @new.
        my @a = ($var1, $var2, $var3, $var4);      # Create array
        push (@new, \@a);                           # Add new array to 
    }
#-------------\CODE-------------
    print "-------------\n";
    print Dumper \@new; 
}

【讨论】:

    【解决方案2】:

    你没有说你的数组是如何组织的。如果它是一个行数组,那么 map 函数就是您想要的工具。编写适用于单行的代码,然后使用 map 将其应用于每一行并收集结果。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2011-07-05
      • 2011-11-29
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多