Мне нужно найти значение в массиве Perl и, если я найду совпадение, выполнить некоторый код - PullRequest
0 голосов
/ 11 июня 2019

Это то, что я хочу сделать. В настоящее время mm ничего не возвращает, а searchname возвращает ожидаемое значение. Это Perl-скрипт, встроенный в веб-страницу. Я перепробовал множество подходов к этому коду, но ничто не дает желаемых результатов. Я думаю, что это всего лишь случай синтаксиса.

#  search for an item
if ($modtype eq "search") {
    $searchname=$modname;
    print "Value of searchname $searchname\n";
    my @mm = grep{$searchname} @names;
    print "Value of mm @mm\n";

    if ($mm eq $searchname) {
        print "$searchname found!\n";
    }
    else {
        print "$searchname not Found\n";        
    }
}

Ответы [ 2 ]

4 голосов
/ 12 июня 2019
my @mm = grep { $_ eq $searchname } @names;
if (@mm) {
    print "found\n";
}

grep принимает логическое выражение, а не просто переменную.В этом выражении $_ относится к текущему элементу списка.Используя сравнение на равенство, мы получаем (в @mm) все элементы @names, равные $searchname, если таковые имеются.

Чтобы проверить, является ли массив пустым, вы можете просто использовать его в логическом значенииконтекст, как в if (@mm).

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

my $count = grep { $_ eq $searchname } @names;
if ($count > 0) {
    print "found $count results\n";
}

Это даст вам количество подходящих элементов.

Если вам не нужно знать это число, просто есть ли какой-либо результат, вы можете использовать any из List::Util:

use List::Util qw(any);

if (any { $_ eq $searchname } @names) {
    ...
}

Если @names большое, это потенциально более эффективно, потому что оно может остановиться после того, как найдено первое совпадение.

Я не уверен, что $mm относится к вашему коду.Вы начали свой код с use strict; use warnings;?Если нет, вам следует.

1 голос
/ 12 июня 2019

Похоже, вы неправильно поняли несколько вещей.

my @mm = grep{$searchname} @names;

Функция grep() принимает два аргумента.Блок кода ({ $searchname }) и список значений (@names).Для каждого значения в списке оно помещает значение в $_ и выполняет блок кода.Если блок кода возвращает истинное значение, то содержимое $_ добавляется в список вывода.

Ваш блок кода игнорирует $_ и просто проверяет значение $searchname.Скорее всего, это всегда будет так, поэтому все значения из @names копируются в @mm.

Я думаю, что более вероятно, что вы захотите:

my @mm = grep{ $_ eq $searchname } @names;

Во-вторыхВы неожиданно начинаете использовать новую переменную с именем $mm.Я подозреваю, что вы путаетесь между @mm и $mm, которые являются абсолютно разными переменными, не связанными друг с другом.

Я думаю, что вы на самом деле пытаетесь сделать, это посмотреть на первый элементиз @mm так что вы хотите:

if ($mm[0] eq $searchname)

Но, учитывая, что значения заканчиваются в @mm, только если они равны $searchname (потому что это то, что делает ваш grep()), я думаюВы действительно просто хотите проверить, закончилось ли что-либо в @mm.Поэтому вы должны использовать:

if (@mm)

Что, на мой взгляд, легче понять.

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