由于这不是这里直接涉及的问题,我最好问一下并回答它。
我遇到了一个问题,即只有在相同的节点不存在的情况下才想将节点名称添加到列表中。该数组使用:
构建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
];
答案 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
将继续迭代整个列表)。