Памятуя о проблемах с числами, которые на самом деле строки, программист написал фукнцию, которая рекурсивно обходит переданную ей структуру данных и in-place нумерифицирует строки, похожие на числа.
Но что-то тут не заладилось…
Выглядит так, будто нумерификация вообще не работает.
Any arguments passed in show up in the array @_. (...) The array @_ is a local array, but its elements are aliases for the actual scalar parameters. (...) Because the assignment copies the values, this also has the effect of turning call-by-reference into call-by-value. perldoc perlsub
Любые аргументы, передаваемые в подпрограму Perl, поступают в нее в виде массива @_. (...) Массив @_ является локальным, но его значения служат псевдонимами для реальных скалярных параметров. (...) Копирование значений заменяем семантику передачи по ссылке семантикой передачи по значению.
Проблема в строчке
Здесь создается локальная для функции копия входного параметра, и когда рекурсия спускается до скалярных значений, нумерификация путем сложением с 0 производится именно над локальной копией скаляра, не затрагивая исходное значение.
Чтобы действительно поменять переданную структуру, стоит работать
непосредственно с элементами массива @_
:
Самое точное и полное объяснение проблемы прислал наш читатель Роман Луговкин. Здорово!
Еще на тему кавычек в json: топик на StackOverflow