2013-04-01 2 views
1

Я использовал эту функцию, чтобы найти значение в массиве на некоторое время, но я хотел бы улучшить:Bash значение находки в массиве

# Checks if the first argument is found in the subsequent ones. 

function my_function_is_value_in() { 

    local -r NEEDLE=$1 
    local -ra HAYSTACK=("${@:2}") 

    local value 
    for value in "${HAYSTACK[@]}"; do 
    [[ $value == "$NEEDLE" ]] && return 0 
    done 

    return 1 

} 

теперь я думаю, что назначение «параметр переименования для удобства чтения» массив HAYSTACK неэффективен, особенно для функции «поиска», потенциально запускать много раз так:

my_function_is_value_in coconut cherry coriander coconut cottage-cheese 

ли Bash есть эффективный способ сделать выше или зацикливается через ${@:2} непосредственно так эффективно, как это может получить?

Сравнение/контраст с perl's grep(/pattern/ @array) .. это специальная функция для выполнения именно этого.

+0

'perl's' функция Grep не является эффективной для решения этой задачи. Он выполняет итерацию по всему массиву, даже если первый элемент был совпадением. Никогда не используйте perl 'grep' в булевом контексте, используйте' List :: MoreUtils :: any'. – jordanm

ответ

1

Вы можете получить лучшие результаты от этого, но я не сделал каких-либо измерений, чтобы продемонстрировать либо образом:

function my_function_is_value_in() 
{ 
    local -r NEEDLE=$1 
    shift 
    local value 
    for value in "[email protected]" 
    do 
     [[ $value == "$NEEDLE" ]] && return 0 
    done 
    return 1 
} 

Идея заключается в том, что оболочка не требуется, чтобы сделать копию массива аргументы таким образом; что должно ускорить процесс.

+0

Вот вам, надеюсь, интересный вопрос для вас, Джонатан: вы уверены, что 'shift' не выполняет копию позиционных аргументов? Могли бы вы это доказать? 'array.c' имеет метод' array_shift', который работает с связанным с нулевым соединением списком, но подсказки 'builtins/shift.def' для копирования мне (' dollar_vars [count] = dollar_vars [count + 1]; '). Ваше занятие? – Robottinosino

+0

Хммм ... Вопрос: Вы уверены, что 'shift' не выполняет копию позиционных аргументов? A: Умеренно. В: Могли бы вы это доказать? A: Не без тщательного изучения исходного кода оболочки. Тем не менее, нет смысла использовать старое значение «$ 1» после его смещения, и нет причин делать копию '$ 2' и др. Конечно, аргументы функции отличаются от аргументов сценария, но концепции все еще применяются. Я не изучал код 'bash', и на самом деле у меня нет планов сделать это в данный момент. –

+0

У меня возникло сомнение в следующем: http://bashcookbook.com/bashinfo/source/bash-4.1/builtins/shift.def ('dollar_vars [count] = dollar_vars [count + 1];'), но, как вы говорите, сейчас это не важно. Спасибо за ответ, который я принял! :) – Robottinosino

0

Кажется быстрее, чем явная петля:

my_function_is_value_in() 
{ 
    [[ "${@:2}" =~ "$1" ]] && return 0 || return 1 
} 
+0

Это совпадает с частным, верно? – Robottinosino

Смежные вопросы