BIG-IP 11.5.2 - PROC - передача по ссылке или возврат

Процедуры были введены в BIGIP-11.4.0, и я пытаюсь получить доступ к внешним переменным, которые передаются в качестве ссылки на процесс или должны быть возвращены из процесса. Пока безуспешно. не слишком много документации по этой функции либо.

https://devcentral.f5.com/wiki/irules.call.ashx

Смотрите пример кода ниже. Я перемещаю слишком много дублирующегося кода в Procs и сталкиваюсь с этой проблемой. Мысли? Любое решение?

Передать по ссылке

TCL имеет ключевое слово upvar, которое поддерживается в Big IP 11.4.x. Это похоже на использование передачи по ссылке. Но это, похоже, не работает для меня. Может быть, я что-то упустил. В приведенном ниже случае значение {test_var} должно быть 10 после вызова proc. Вместо этого это все еще 1.

процедура

proc testproc_byref { {test_var}} {
upvar 1 $test_var var
set var 10
log local0. "Inside the proc by ref. Setting its value to 10"
log local0. "test_var ${test_var}"
}

гость

call TEST_LIB::testproc_byref ${test_var}
log local0. "AFTER calling the proc test_var : ${test_var}"

Выход

Before calling the proc test_var : 1
Inside the proc by ref. Setting its value to 10
test_var 1
AFTER calling the proc test_var : 1

Вопросы:-

А) Есть ли способ передать переменную ${test_var} в качестве ссылки от вызывающей стороны к процессу, чтобы значение манипулируемой переменной в процедуре могло быть доступно для вызывающей стороны?

Или же

Б) Есть ли способ вернуть переменную ${test_var} обратно вызывающей стороне, чтобы она могла быть использована вызывающей стороной?

1 ответ

Решение

Использование Pass by version [для вопроса a) выше]

Просто извлеките $ и фигурные скобки переменной, передаваемой в качестве ссылки, так что вместо этого:

call TEST_LIB::testproc_byref ${test_var}

использовать этот:-

call TEST_LIB::testproc_byref test_var

Используя Return [для вопроса б) выше]

Приведенный ниже ответ использует ключевое слово return для возврата одного значения из proc. Но это касается только сценария, когда у вас есть единственное значение, которое будет возвращено.

"return" поддерживается внутри proc, поэтому манипулирующее значение в proc может быть возвращено и использовано вызывающей стороной.

Commonlib iRule

proc testproc { {test_var}} {
set test_var 5
log local0. "Inside the proc"
log local0. "test_var ${test_var}"
return ${test_var}
}

гость

set returned_test_var [call TEST_LIB::testproc ${test_var}]
log local0. "AFTER calling the proc test_var - Returned : ${returned_test_var}"

ВЫХОД

Перед вызовом процедуры test_var: 1

Внутри прока

test_var 5 ПОСЛЕ вызова proc test_var - Возвращено: 5

Другие вопросы по тегам