Замените foreach с помощью grep в perl - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в Perl, и я попытался заменить свое выражение foreach (версия 1):

use warnings;
use strict;

$cmd_list = "abc network xyz";
foreach my $item (split(" ", $cmd_list)) {
if( $item eq "network") {
    $PRINT_IP = 1;
    }
}

на grep (версия 2, из некоторого примера в Интернете), который должен дать мнеколичество (из-за скалярного контекста) значения "network" в строковом массиве:

$PRINT_IP = grep(/^$network$/, split(" ", $cmd_list));

для версии 1 оператор if работает, как предполагалось, но для версии 2 он всегда оценивается как false:

if($PRINT_IP) {
    ...
}

Где моя вина?

1 Ответ

0 голосов
/ 19 сентября 2018

Кажется, что есть опечатка, так как $network является переменной;Вы можете иметь в виду /^network$/.

Наличие в вашей программе use strict; предупредило бы вас о непреднамеренной (так необъявленной) переменной.Наличие use warnings; предупредило бы вас об использовании неинициализированной переменной при компиляции регулярного выражения.

В цикле вы устанавливаете переменную $PRINT_TP (в 1) только в том случае, если есть какие-либо элементы, которые соответствуют.Тогда List :: Util имеет функцию только для этого

my $PRINT_IP = any { $_ eq 'network' } split ' ', $cmd_list;

или

my $PRINT_IP = any { /^network\z/ } split ' ', $cmd_list;

, если вам нужно регулярное выражение для более сложных условий.

Это возвращает 1 при первом совпадении, результат, который создает ваш цикл for.Если вам действительно нужен счет, тогда действительно используйте grep.Когда совпадения нет, $PRINT_IP устанавливается на '', пустая строка.

Библиотека более эффективна, во-первых, так как она прекращает обработку, когда совпадение происходит.Вы также можете сделать это, добавив last в ваше условие if, но процедуры List::Util обычно более эффективны.

Более важно: пожалуйста, всегда указывайте use warnings; и use strict; в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...