Как я могу определить, существует ли элемент в массиве (perl)

Я перебираю массив и хочу проверить, найден ли элемент в другом массиве.

В псевдокоде -я пытаюсь сделать это:

foreach $term (@array1) {
    if ($term is found in @array2) { 
        #do something here
    }
}

У меня есть части "foreach" и "сделать что-нибудь здесь" -pat... но все, что я пробовал для теста "если термин найден в массиве", НЕ работает...

Я пробовал grep:

if grep {/$term/} @array2 { #do something }
# this test always succeeds for values of $term that ARE NOT in @array2

if (grep(/$term/, @array2)) { #do something }
# this test likewise succeeds for values NOT IN the array

Я пробовал несколько разных вариантов «преобразования массива в хэш», которые, как указывалось во многих предыдущих сообщениях, настолько просты и легки... и ни один из них не сработал.

Я долгое время -низко -пользователь Perl, я понимаю только основы Perl, не понимаю всего причудливого запутанного кода, который включает 99% решений, которые я читал в Интернете... я бы действительно, искренне, честно цените любые ответы, которые явно указаны в коде и предоставляют пошаговое -за -объяснение того, что делает код...

... Я серьезно не понимаю $ _и любые другие виды или типы скрытых, понятных или подразумеваемых значений, переменных или функций. Я был бы очень признателен, если бы в каких-либо примерах или образцах все переменные и функции были названы четкими терминами ($term, а не $ _)...и опишите с комментариями, что делает код, чтобы я, во всей своей умственно отсталой славе, мог надеяться когда-нибудь понять его. Пожалуйста.:-)

...

У меня есть существующий скрипт, который несколько успешно использует 'grep':

$rc=grep(/$term/, @array);
if ($rc eq 0) { #something happens here }

но я применил этот ТОЧНО тот же код к моему новому скрипту, и он просто НЕ работает должным образом... т. е. он «успешно» (rc = ноль ), когда он проверяет значение $term, которое, как я знаю, НЕ присутствует в тестируемом массиве. Я просто не понимаю.

ЕДИНСТВЕННАЯ разница в моем подходе «grep» между «старым» скриптом и «новым» скриптом заключается в том, как я строил массив... в старом скрипте я строил массив, читая из файла:

  @array=`cat file`;

тогда как в новом скрипте я помещаю массив внутрь самого скрипта (, потому что он маленький )... вот так:

  @array=("element1","element2","element3","element4");

Как это может привести к другому выводу функции grep? Они оба болотные -стандартные массивы! я не понимаю!!!!:-(

########################################################################

дополнение... некоторые пояснения или примеры моего фактического кода:

########################################################################

Термин, который я пытаюсь сопоставить/найти/grep, является элементом слова, например, «word123».

Это упражнение было задумано как быстрый -n -грязный скрипт для поиска важной информации в файле, полном мусора, поэтому я опускаю все тонкости (use strict, warnings, modules, subroutines )по выбору... это не обязательно должно быть элегантно, просто просто.

Термин, который я ищу, хранится в переменной, экземпляр которой создается с помощью разделения :

foreach $line(@array1) {
  chomp($line);  # habit

  # every line has multiple elements that I want to capture
  ($term1,$term2,$term3,$term4)=split(/\t/,$line);  

  # if a particular one of those terms is found in my other array 'array2'
  if (grep(/$term2/, @array2) { 
    # then I'm storing a different element from the line into a 3rd array which eventually will be outputted
    push(@known, $term1) unless $seen{$term1}++;
  }
}

. видишь, что grep там? Это работает неправильно... это удается для всех значений $term2, даже если они определенно НЕ находятся в массиве2... массив1 - это файл из пары тысяч строк. Элемент, который я здесь называю $term2, — это дискретный термин, который может находиться в нескольких строках, но никогда не повторяется (или является частью более крупной строки )в любой заданной строке. Array2 — это около пары десятков элементов, которые мне нужно «отфильтровать» для моего вывода.

...

Я только что попробовал одно из следующих предложений:

if (grep $_ eq $term2, @array2) 

И этот grep потерпел неудачу для всех значений $term2... Я получаю ответ "все или ничего" от grep... так что я думаю, мне нужно прекратить использовать grep. Попробуйте одно из этих хэш-решений... но мне действительно не помешало бы больше объяснений и разъяснений по ним.

11
задан MuleHeadJoe 6 July 2012 в 18:03
поделиться