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