- 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 "";
}
MAKAKA 01.11.2019 16:43 # 0
govninho 01.11.2019 16:47 # +1
Так что по факту у всех функций список параметров вариативный.
MAKAKA 01.11.2019 16:50 # 0
>"Нечетные аргументы - массивы, четные - ключи"
Это тоже очень удобно, напоминает планары из некоторых режимов VGA
Вообще семантика у функции - ок
govninho 01.11.2019 16:52 # +1
MAKAKA 01.11.2019 16:57 # +2
WARNING: Subroutine signatures are experimental. The feature may be modified or removed in future versions of Perl.
какой багор
govninho 01.11.2019 17:08 # 0
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.
guest8 01.11.2019 17:14 # −999
govninho 01.11.2019 17:28 # 0
http://govnokod.ru/18746#comment438710
http://govnokod.ru/18746#comment438738
https://en.wikipedia.org/wiki/Zahn%27s_construct
guest8 01.11.2019 17:58 # −999
guest8 01.11.2019 19:05 # −999
guest8 01.11.2019 19:06 # −999
whois 02.11.2019 21:41 # 0
MAPTbIwKA 06.11.2019 13:40 # +1
прототайпы это офигенный костылёк, который к тому же иногда не работает.
Смысл вот в чем
В перле функция всегда получает массив параметров. Чтобы ты ей ни передал -- это что-то всегда раскроется в списковом контексте в массив.
Если ты попытаешься ей передать массив, то он ей и скопируется.
Если передаешь два массива -- они сольются воедино и передадутся (как это с ними случается в списковом контексте)
Если ты хочешь изменить что-то в массиве (ну или просто чтобы быстро работало) ты хочешь получить массив по ссылке.
Можно вручную при вызове функции сказаить
foo \@myarr;
тогда функция получит массив из одной ссылки на массив myarr;
А можно в прототипе явно сказать
sub foo(\@)
эт будет как & в крестах или ref в C#.
Тогда перл поймет, что ты ожыдаешь рефересн, и явно тебе ее передаст.
Но это работает только если функция диспачнулась статически. А иначе перл про нее ничего не знает.
Потому это не работает при указателях на функции.
И, соответственно, не работает при ооп так как диспатчится вызов метода динамически.
А еще не работает при префиксировании функции &, так как это старый синтаксис
koshka_Sviborga 06.11.2019 15:28 # 0
guest8 06.11.2019 15:52 # −999