Учитывая один аргумент, конструктор Array
сглаживает его. Это вызывает проблемы:
my %hash = (a => 1; b => 2);
my @array = [ %hash ]; # result: [a => 1 b => 2], expected [{ a => 1, b => 2 }]
Конструктор списка не имеет этого quirk (правило одного аргумента), но, к сожалению, не существует короткого синтаксиса для создания однострочного правила, список элементов:
List.new(%hash); # result is ({a => 1, b => 2}), as expected
Обходной путь: если ваш аргумент является скаляром, он не будет автоматически сглаживаться:
my $hash = %hash;
my @array = [ $%hash ]; # or my @array = [ $%hash ], or just my @array = $%hash
# result: [{a => 1, b => 2}], as expected
Другим обходным решением является добавление запятой в конец списка элементов:
my @array = [ %hash, ];
Реальная проблема заключается в том, когда мы выписываем данные буквально. Представление JSON-подобной вложенной структуры в Perl 6 является реальной проблемой, если 1-элементные списки сглажены, но других списков нет. Данные оказались неправильными. Мне пришлось записывать много данных при использовании MongoDB, поскольку аргументы MongoDB API должны быть отформатированы как вложенные списки/массивы. Это было почти невозможно. Поэтому я спрашиваю, в чем заключается мотивация сглаживания одного элемента массива?