由于这不是这里直接涉及的问题,我想最好的问题并回答它.
我有一个问题,我只想在同一节点不存在的情况下将节点名称添加到列表中.该阵列使用以下方式构建:
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)
我会说"不要"而是:
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将继续迭代整个列表).