Зависание конкатенации строк в Perl6 - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь объединить строку с Perl6 следующим образом:

my $cmd = "databricks jobs --job-id 37 --notebook-params '\{";
put $cmd;
$cmd ,= "\"directory\": \"$s3-dir\",";
put $cmd;

Однако вывод зависает после оператора ,=.Я предполагаю, что это работает так же, как оператор Perl .=.

https://docs.perl6.org/language/operators

Почему эта работа зависает?как я могу правильно объединить строку?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

В Perl6 нет операторов ,= или ~=.

Это экземпляры мета-оператора = в сочетании с другим инфиксным оператором.

# these are all functionally equivalent:
$a = $a ~ 'a';
$a ~= 'a';
$a [~]= 'a';
$a [&[~]]= 'a';
$a [&infix:<~>]= 'a';

$a = infix:<~> $a, 'a'; # use an operator as a subroutine

Существует история языков, подобных С, с такими операторами, как +=.
Было бы немного утомительно определять новые операторы, подобные этим, для каждого инфиксного оператора.
В Perl6 вы также можете легко определять новые операторы.
Таким образом, он имеет = в качестве мета-оператора, который будет автоматически работать со всеми инфиксными операторами.

sub infix:<foo> (\l,\r){…}

$a = $a foo 3;
$a foo= 3;
$a [foo]= 3;

Если вы хотите использовать такой оператор, как +=, просто посмотритедля базового оператора, который соответствует тому, что вы хотите, и добавьте =.

Если вы хотите выполнить конкатенацию строк, базовый оператор - это оператор infix ~.
(который очень похож наПрефиксный оператор приведения строки ~.)

$a = $a ~ 'a';
$a ~= 'a';

Если вы хотите установить Разницу, базовый оператор будет (-).

$a = $a (-) 3;
$a (-)= 3;

. Вы можете добавить любойчисло [], окружающее инфиксный оператор.
(Ему нужно пространство перед ним, чтобы его не перепутать с postcircumfix [])

$a     -     3;
$a    [-]    3;
$a   [[-]]   3;
$a  [[[-]]]  3;

Что может быть полезно, чтобы убедиться, что мета-операторы комбинируют то, что вам нужно.

$a -=         3;
$a [-]=       3;
3  R-=       $a; # $a = $a - 3;
$a [R-]=      3; # $a = 3 - $a;
3  R[-=]     $a; # $a = $a - 3;
3  R[[R-]=]  $a; # $a = 3 - $a;

Это было расширено так, что [&…], где &… - имя функции, работает как инфиксный оператор.

sub bar (\l,\r){…}

# these are functionally identical.
$a = bar( $a, 3 );
$a = $a [&bar] 3;
$a [&bar]= 3;

Когда вы использовали ,=, высоздал самоссылочную структуру данных.
(обратите внимание, что say вызывает .gist, я добавил дополнительный .gist, чтобы было ясно, что я не печатаю Str.)

my $c = 0;
# $c ,= 1;
$c = ($c,1);

say $c.gist;
# (\List_94195670785568 = (List_94195670785568 1))

say $c.WHICH;
# List|94195670785568

Когда вы делаете что-то, что приводит List или Array в Str, оно следует структуре, превращающей каждую часть в Str.

$c = ($c,…);

~$c;
# $c.Str
# |     \___________________
# |                         \
# $c[0].Str ~ ' ' ~ $c[1].Str
# |        \        \        \__________ 
# |    |    \        \__________________ 1.Str
# |    |     \
# |    V      \_____________
# |                         \
# $c[0].Str ~ ' ' ~ $c[1].Str
# |        \        \        \__________ 
# |    |    \        \__________________ 1.Str
# |    |     \
# |    V      \_____________
# |                         \
# $c[0].Str ~ ' ' ~ $c[1].Str
# |        \        \        \__________ 
# |    |    \        \__________________ 1.Str
# |    |     \
# |    V      \_____________
# |                         \
# …

Это, конечно, никогдазаканчивает превращать первую часть в Str.


Комбинация , и = безопасно работает с хэшем.
(Это то, что показывают документы.)

my %c = a => 0;
%c ,= b => 1;
# %c = (%c, b => 1)

say %c.gist;
# {a => 0, b => 1}
0 голосов
/ 28 января 2019

В руководстве возникла путаница.

my $cmd = "databricks jobs --job-id 37 --notebook-params '\{";
put $cmd;
$cmd ,= "\"directory\": \"$s3-dir\",";
put $cmd;

должно быть

my $cmd = "databricks jobs --job-id 37 --notebook-params '\{";
put $cmd;
$cmd ~= "\"directory\": \"$s3-dir\",";
put $cmd;

. Правильный способ объединения уже объявленной переменной в Perl6 - ~=

...