Grep二维数组

Tar*_*aur 0 arrays perl

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

我有一个问题,我只想在同一节点不存在的情况下将节点名称添加到列表中.该阵列使用以下方式构建:

push (@fin_nodes, [$node, $hindex, $e->{$hip}->{FREQ}]);
Run Code Online (Sandbox Code Playgroud)

所以给定的数组(@fin_nodes)看起来像:

$VAR1 = [
      'first-node',
      '4',
      3
    ];
$VAR2 = [
      'second-node',
      '1',
      3
    ];
$VAR3 = [
      'another-node',
      '1',
      5
    ];
$VAR4 = [
      'some-node',
      '0',
      5
    ];
Run Code Online (Sandbox Code Playgroud)

要对此进行grep以下工作:

my @match = grep { grep { $_ =~ $node } @$_ } @fin_nodes;
Run Code Online (Sandbox Code Playgroud)

因此,给定一个$ node"second-node",上面的语句将返回@match:

$VAR1 = [
  'second-node',
  '1',
  3
];
Run Code Online (Sandbox Code Playgroud)

Sob*_*que 5

我会说"不要"而是:

my %fin_nodes;
$fin_nodes{$node} = [$hindex, $e->{$hip}->{FREQ}]);
Run Code Online (Sandbox Code Playgroud)

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

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

所以:

 my @matches = grep { $_ -> [0] eq $node } @fin_nodes; 
Run Code Online (Sandbox Code Playgroud)

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

例如,在你的例子中 - 如果你寻找一个叫做"node"你的节点,你会获得多次点击.

注意 - 如果您只是寻找一场比赛,您可以执行以下操作:

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

这将只是让你的第一个结果,而其余部分将被丢弃.(这不是太有效,因为grep将继续迭代整个列表).

  • "因为后者将子串匹配"假设没有正则表达式元字符; 如果有的话,情况会更糟 (2认同)