Perl - grep в foreach не работает с $ _, но был с переменной - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу удалить некоторые определенные элементы из массива.У меня уже есть решение с grep и одним элементом: @big = grep { ! /3/ } @big.В случае нескольких элементов я хочу поместить их в массив и использовать foreach.@big - это массив, из которого я хочу удалить элементы из @del:

perl -e "@big = (1,2,3,4,5); @del = (2,4); 
      foreach $i (@del) {@big = grep { ! /$i/ } @big; print \"@big\n\"}"

Вот вывод:

1 3 4 5
1 3 5

Это прекрасно работает для меня.Если я хочу использовать переменную по умолчанию $_, она не работает:

perl -e "@big = (1,2,3,4,5); @del = (2,4); 
      foreach (@del) {@big = grep { ! /$_/ } @big; print \"@big\n\"}"

Это не дает вывода.Есть идеи, что происходит?

1 Ответ

0 голосов
/ 22 ноября 2018

Как указывает @MattJacob, существует два конфликтующих варианта использования $_:

foreach (@del) {...}

. Это неявно использует $_ в качестве переменной цикла.Из документов foreach :

Ключевое слово foreach фактически является синонимом для ключевого слова for, поэтому вы можете использовать любое из них.Если VAR опущен, $ _ устанавливается для каждого значения.

Ваша команда grep также использует $_, всегда , как часть своей обработки.Так что, если у вас есть значение в $_ как часть вашего foreach, и оно было заменено в grep ...?

Из grep документов:

Оценивает BLOCK или EXPR для каждого элемента LIST (локально устанавливая $ _ для каждого элемента)

Пожалуйста, проверьте документы grep, так как есть явное предупреждение об изменениисписок, который вы перебираете.Если вы пытаетесь итеративно сократить список, вы можете рассмотреть несколько альтернативных способов его обработки.(Например, не могли бы вы создать один шаблон для grep, который бы объединял все значения в вашем списке @del, и просто обрабатывал бы список @big один раз? Это также может быть быстрее.)

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