Решение состоит в том, чтобы написать $@array
вместо \@array
:
$worksheet.write_row(0,0, $@line)
Остальная часть этого ответа представляет собой краткое руководство по написанию кода с использованием установленных адаптеров для иностранных языков и решению любых возникающих проблем.,Я предполагаю, что это будет общий ресурс, ответ, который выходит далеко за рамки этого конкретного вопроса.
Он начинается с очевидного вопроса «Почему $@foo
?», Обсуждает, как успешно использовать адаптеры иностранных языков, и закрывается.объясняя, почему предупреждающее сообщение было бесполезным.
Почему $@foo
?
Запись $@foo
для передачи @foo
в виде массива ссылка на P5 является простойи естественное использование существующей функции P6.
Тем не менее, пользователям не нужно понимать эту $
функцию P6, и при этом им не нужно знать, как Inline::Perl5
использует ее, чтобы выполнить то, чтоони хотят выполнить (написать код P6, который передает ссылку на массив функции из модуля P5).
Итак, основной ответ на вопрос «почему $@foo
?»это то, что вы пишете это так, и это работает.\ o /
Как узнать магические заклинания?
Я получил решение для передачи ссылки на массив из Inline :: Perl5 README :
HASH
и ARRAY
ссылки делаются автоматически, если объекты Perl 6 контейнеризованы:
$p5obj.takes-an-array: [<a b c>];
$p5obj.takes-an-array-ref: $[<a b c>];
(Слово «контейнер» относится к концепции P6, которую объясняет lizmatхорошо для тех, кто знает P5 в ее Containers в статье P6 . Но контейнеровоз фактически не имеет технического значения для , почему $@foo
означает массив ref в P5 при использовании Inline::Perl5
. Да, это работает. Нет, так не должно быть.)
Почему $@foo
в P6 означает ссылку на массив в P5?
Причина написания $@foo
правильно нужно сделать не потому, что язык P6 или компилятор говорят, что это так.
Это равно соответствующая P6 функция,но причина, по которой это правильно , заключается в том, что так говорит девятка (автор Inline::Perl5
).
Почему Нинер выбрал $@foo
?
Предположительно, потому что это:
Легко писать для новичков;
Будет иметь смысл для этой цели, когда кто-то узнает P6;
Легко для документа,
Легко конвертировать изего значение P6 (от Array
в Scalar
) до целевого значения P5 (ссылка на массив P5) в быстродействующей манере.
Чего ожидать при использовании адаптеров иностранных языков
Inline::Perl5
- один из нескольких адаптеров для иностранных языков .Эти адаптеры позволяют коду P6 встраивать код, написанный на этих иностранных языках, и / или использовать модули, написанные на этих иностранных языках.
Когда компилятор Rakudo P6 видит :from<Perl5>
в операторе use
, он неявновызывает ранее установленный модуль P6 под названием Inline::Perl5
.
Inline::Perl5
устанавливает код маршалинга , который автоматически отображает код P6 в код P5 и из него, так что P6 и P5 могут работать вместе с минимальными усилиями.
В идеале адаптеры просто делали бы свою работу, и вам никогда не приходилось бы о них думать.Но:
В то время как очевидная вещь для сопоставления 42
в P6 на любом иностранном языке - это их значение, представляющее целое число 42
, отображение не всегда такое прямое- вперед для структур данных высокого уровня, функций, ссылок и т. д. Иногда удивительно, что можно сделать, написав код P6 (вы можете создать класс P6, который является подклассом класса P5, написав его точно так же, как если бы он был обычнымКод P6!) Но иногда вы должны следовать правилу (как в этом случае, как передать массив P6 в P5 в качестве ссылки на массив).См. документацию по адаптеру ниже.
Язык P6 и компилятор не знают, что происходит отображение.Поэтому любые отображаемые ими сообщения об ошибках или предупреждения могут быть бесполезными и даже вводить в заблуждение.Кроме того, ошибки адаптера отделены от ошибок в P6, в его компиляторах и в используемых модулях иностранного языка.См. Раздел Предупреждения и ошибки ниже.
Выполнение автоматического сопоставления, выполняемого адаптерами иностранных языков, далеко от автоматического.Талантливые разработчики должны написать код адаптера, который выполняет весь маршалинг данных, исключений и т. Д.
При достаточном затраченном времени (годах) адаптер может быть в состоянии приблизиться к идеалу, в котором вам никогда не придется думатьо существовании адаптера, если вы просто хотите использовать модули или код этого языка в P6.Вы просто используете его, и он всегда работает точно так же, как и на иностранном языке.
Один из способов быстрее понять этот идеал для вас, дорогой читатель и для всех нас, - это использовать иностранные модуличерез существующие адаптеры и пишите SO вопросы и проблемы с файлами, когда определенные функции, кажется, не работают.Спасибо @con, niner, и всем, кто делает это возможным.
Документация по адаптеру
Единственный способ точно знать, какой код P6 вы должны написать, чтобы использоватьмодуль иностранного языка, который вы использовали с помощью :from<...>
, предназначен для:
Прочитайте документацию к модулю иностранного языка, чтобы узнать, чего он ожидает;а затем
Прочитайте документацию адаптера, чтобы узнать, как написать соответствующий код P6, который дает иностранному языку и модулю иностранного языка то, что они ожидают.
В данном случае, когда мы говорим об использовании :from<Perl5>
, адаптером является Inline::Perl5
.Его документация в настоящее время его репозиторий проекта github README .Чтобы увидеть, что вы должны написать, чтобы дать P5 и модулю P5 то, что они ожидают, прочитайте этот документ.
Каждый адаптер будет иметь свою собственную документацию;см. список в modules.perl6.org для ссылки.
Предупреждения и ошибки
Если что-то пойдет не так при использовании модуля иностранного языка в P6 (который не 'при использовании того же кода непосредственно на этом иностранном языке)):
Убедитесь, что вы прочитали документацию к соответствующему адаптеру;
Если вы получаете предупреждение или сообщение об ошибке, обязательно обратитесь к документации адаптера и к его очереди проблем, чтобы увидеть, проливает ли он это конкретное сообщение;
Если вы считаете, что естьошибка в том, как все работает (или не работает) в P6 при использовании модуля на иностранном языке, который прекрасно работает при непосредственном использовании на этом иностранном языке, обратитесь к очереди проблем адаптера.Например, если вы используете :from<Perl5>
, обратитесь к очереди выдачи Inline::Perl5
.Если вы решили что-то опубликовать, то пишите здесь, если вы не уверены, что это ошибка, или в очереди проблем адаптера, если вы.
Поскольку язык P6 и компилятор незная, что отображение происходит, предупреждения и сообщения об ошибках могут вводить в заблуждение в контексте обучения использованию любых аспектов адаптера иностранного языка, которые включают в себя следующие правила, такие как правило $@foo
этого SO.
Inв случае проблем с P5 это может усугубляться тем, что P6 пытается помочь кодировщикам P5, пишущим код P6, и тем, что пытается использовать обратную реакцию при использовании Inline::Perl5
.Пример в вопросе является хорошим примером:
To pass an array, hash or sub to a function in Perl 6, just pass it as is.
P6 думает, что вы могли бы использовать для написания ссылок на массивы, используя префикс \
.Он думает, что вы можете не знать, что вам не нужно писать косую черту в P6.Он не понимает, что вы настаиваете на получении ссылки на массив, которую P5 будет понимать через Inline::Perl5
.
For other uses of Perl 5's ref operator consider binding with ::= instead.
P6 думает, что вы пытаетесь сделать то, что в P5 обычно делается с \
, не потому, что вы хотите работать с P5, а потому, что вы знаете P5, хотите что-то сделать в P6 без участия P5 , и надеемся, что тот же синтаксис работает.
(Кстати, совет ::=
определенно не мог помочь - потому что ::=
еще не реализован!)
Parenthesize as (...) if you intended a capture of a single variable.
P6 не думает, что вы пытаетесь заставить функцию P5 работать со ссылкой на массив.Он думает, что вы пытаетесь создать P6 Capture
.
Предполагается, что его совет интерпретируется как предложение написать \(@foo)
вместо \@foo
для создания Capture
содержащий @foo
.
Он предупредил об использовании \@foo
для обозначения Capture
именно потому, что разработчики P5 могут написать его, думая, что создаст ссылку на массив.
Итак, P6 не знает, что Inline::Perl5
существует или что он собирается что-то делать с вашим кодом.Вместо этого его совет - попытка перевести синтаксис и понятия P5, которые, по его мнению, вы используете, в соответствующие синтаксис и понятия в P6.Это не попытка посоветовать, как написать код P6, подходящий для преобразования в P5 через Inline::Perl5
.
Все это говорит о том, что возможно, что разработчики адаптераи основные разработчики P6 однажды изменят связанные с P5 предупреждения и сообщения об ошибках в свете проблем с юзабилити, которые были подняты этой SO.