Perl: удаление элемента со специальным символом из массива

#perl

#perl

Вопрос:

Я могу удалять элементы из массива, когда это имя устройства или IP-адрес, но когда в имени элемента ниже есть специальный символ, команда ie не работает.

Любезный совет, поскольку я пробовал 2-3 способа, и все они не работают…

Например, если значение ключа равно network или ip 100.100.100.100, приведенная ниже логика работает нормально, но когда имя ключа — net-switch или router-net, оно не удаляется.

 option1 

@array = eval { grep { $_ != $Key } @array1; };

Option2
@array = eval{ grep { $_->[0] ne "$Key" } @array1; }; 


2014/06/29 11:14:56 $VAR1 = [
          '100.2.2.3-0-2',
          '100.4.7.1-0-2',
          '100.2.120.2-0-2',
          '100.1.2.29-3-2',
          'network-0-2',
          'switch-1-1',
          'network-0-2',
          'router45',
           ];
  

Спасибо,

Комментарии:

1. попробуйте третий вариант @array = grep { $_ ne $Key } @array1;

2. Был бы полезен скрипт с возможностью запуска с фактическим $key и @array . Как всегда, используйте предупреждения и строгие;

3. Я получаю сообщение об ошибке Не могу использовать строку («network-xyz») в качестве ссылки на МАССИВ, пока «строгие ссылки» используются в

4. mpapec @array содержит список имен маршрутизаторов, коммутаторов и информации о сети. а ключ — это ip-адрес, имя маршрутизатора и имена со специальным символом, я имею в виду с тире..

5. Пожалуйста, сделайте use Data::Dumper; print Dumper @array; и предоставьте выдержку выходных данных, чтобы мы точно знали структуру данных.

Ответ №1:

!= это числовой not equal оператор, но поскольку вы хотите проверить строковое неравенство, используйте ne operator

 my @array = grep { $_ ne $Key } @array1;
  

Ответ №2:

 use warnings;
use strict;

my @array = (
          '100.2.2.3-0-2',
          '100.4.7.1-0-2',
          '100.2.120.2-0-2',
          '100.1.2.29-3-2',
          'network-0-2',
          'switch-1-1',
          'network-0-2',
          'router45',
           );

# my $key = '100.2.2.3-0-2'; # Either of these will work 
my $key = 'network-0-2';

my @keep;
foreach (@array){
    push @keep, $_ unless $_ eq $key;
}

print Dumper @keep;
  

 100.2.2.3-0-2
100.4.7.1-0-2
100.2.120.2-0-2
100.1.2.29-3-2
switch-1-1
router45
  

Комментарии:

1. Спасибо за ответ . Если я не хочу печатать запись, могу ли я написать как foreach (@array){ если $_ eq $key; push(array1, $key); }