- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
/**
* <p>Статический метод размещает все аргументы и ключи по парам.</p> <p>Нечетные аргументы - массивы, четные - ключи, по которым искать в массивах.</p> <p>Ключи могут быть массивами. В этом случае поиск происходит во вложенных массивах. Возвращает первый не пустой элемент пары аргумент/ключ.</p>
*
*
* @param array $arraya массив для анализа
*
* @param array $string Ключи поиска
*
* @param strin $integerk Неограниченные последовательно проверяемые пары массив\ключ
*
* @param integer $mixeda
*
* @return mixed
*
* @static
* @link http://dev.1c-bitrix.ru/api_d7/bitrix/main/type/collection/firstnotempty.php
* @author Bitrix
*/
public static function firstNotEmpty()
{
$argCount = func_num_args();
for ($i = 0; $i < $argCount; $i += 2)
{
$anArray = func_get_arg($i);
$key = func_get_arg($i+1);
if (is_array($key))
{
$current = &$anArray;
$found = true;
foreach ($key as $k)
{
if (!is_array($current) || !array_key_exists($k, $current))
{
$found = false;
break;
}
$current = &$current[$k];
}
if ($found)
{
if (is_array($current) || is_object($current) || $current != "")
return $current;
}
}
elseif (is_array($anArray) && array_key_exists($key, $anArray))
{
if (is_array($anArray[$key]) || is_object($anArray[$key]) || $anArray[$key] != "")
return $anArray[$key];
}
}
return "";
}
Так что по факту у всех функций список параметров вариативный.
>"Нечетные аргументы - массивы, четные - ключи"
Это тоже очень удобно, напоминает планары из некоторых режимов VGA
Вообще семантика у функции - ок
WARNING: Subroutine signatures are experimental. The feature may be modified or removed in future versions of Perl.
какой багор
https://metacpan.org/pod/perlsub
Оказывается, в «Перле» есть СИГНАТУРЫ и ПРОТОТИПЫ.
There is a potential syntactic ambiguity between signatures and prototypes (see "Prototypes"), because both start with an opening parenthesis and both can appear in some of the same places, such as just after the name in a subroutine declaration.
Сигнатуры выглядят так же, как в других языках программирования. А вот прототипы — какое-то прыщеблядство:
The + prototype is a special alternative to $ that will act like \[@%] when given a literal array or hash variable, but will otherwise force scalar context on the argument.
http://govnokod.ru/18746#comment438710
http://govnokod.ru/18746#comment438738
https://en.wikipedia.org/wiki/Zahn%27s_construct
прототайпы это офигенный костылёк, который к тому же иногда не работает.
Смысл вот в чем
В перле функция всегда получает массив параметров. Чтобы ты ей ни передал -- это что-то всегда раскроется в списковом контексте в массив.
Если ты попытаешься ей передать массив, то он ей и скопируется.
Если передаешь два массива -- они сольются воедино и передадутся (как это с ними случается в списковом контексте)
Если ты хочешь изменить что-то в массиве (ну или просто чтобы быстро работало) ты хочешь получить массив по ссылке.
Можно вручную при вызове функции сказаить
foo \@myarr;
тогда функция получит массив из одной ссылки на массив myarr;
А можно в прототипе явно сказать
sub foo(\@)
эт будет как & в крестах или ref в C#.
Тогда перл поймет, что ты ожыдаешь рефересн, и явно тебе ее передаст.
Но это работает только если функция диспачнулась статически. А иначе перл про нее ничего не знает.
Потому это не работает при указателях на функции.
И, соответственно, не работает при ооп так как диспатчится вызов метода динамически.
А еще не работает при префиксировании функции &, так как это старый синтаксис