Grep二维数组

时间:2017-11-14 14:00:45

标签: arrays perl

由于这不是这里直接涉及的问题,我最好问一下并回答它。

我遇到了一个问题,即只有在相同的节点不存在的情况下才想将节点名称添加到列表中。该数组使用:

构建
push (@fin_nodes, [$node, $hindex, $e->{$hip}->{FREQ}]);

因此给定的数组(@fin_nodes)看起来像:

$VAR1 = [
      'first-node',
      '4',
      3
    ];
$VAR2 = [
      'second-node',
      '1',
      3
    ];
$VAR3 = [
      'another-node',
      '1',
      5
    ];
$VAR4 = [
      'some-node',
      '0',
      5
    ];

要对此进行以下工作:

my @match = grep { grep { $_ =~ $node } @$_ } @fin_nodes;

给定一个$ node" second-node"上述语句将返回@match:

$VAR1 = [
  'second-node',
  '1',
  3
];

1 个答案:

答案 0 :(得分:5)

我会说"不要"而是:

my %fin_nodes;
$fin_nodes{$node} = [$hindex, $e->{$hip}->{FREQ}]);

然后你可以简单地if ($fin_nodes{$node}) {

虽然失败了 - 你不需要grep每个元素,因为你的节点名永远是第一个。

所以:

 my @matches = grep { $_ -> [0] eq $node } @fin_nodes; 

eq可能是比=~更好的选择,因为后者将匹配子串。 (更糟糕的是,如果你在那里有元字符,可能会做一些非常意外的事情,因为你没有引用或逃避它们)

E.g。在您的示例中 - 如果您查找名为"node"的节点,您将获得多次点击。

注意 - 如果您只查找一个匹配项,则可以执行以下操作:

my ( $first_match ) =  grep { $_ -> [0] eq $node } @fin_nodes; 

这将只是获得第一个结果,其余的将被丢弃。 (这不是太高效,因为grep将继续迭代整个列表)。

相关问题