我遇到了一个 Perl 脚本,它使用以下 .= 语法
$key .= $descriptions[$i];
.= 在这里意味着什么
答案1
.=
在C中就是喜欢.
什么。+=
+
$a += 4;
就好像:
$a = $a + 4;
$a .= "x";
就好像:
$a = $a . "x";
与大多数运营商相同。
.
本身是字符串连接运算符,因此$key .= $descriptions[$i];
appends$descriptions[$i]
比以下更短且更高效:
$key = $key . $descriptions[$i];
或者
$key = "$key$descriptions[$i]";
与所有运算符一样,它的描述如下perldoc perlop
:
赋值运算符
“=”是普通的赋值运算符。
赋值运算符的工作方式与 C 语言相同。即,
$x += 2;
相当于
$x = $x + 2;
尽管不会重复取消引用左值可能触发的任何副作用,例如“tie()”。其他赋值运算符的工作原理类似。以下是公认的:
**= += *= &= &.= <<= &&= -= /= |= |.= >>= ||= .= %= ^= ^.= //= x=
虽然这些是按家庭分组的,但他们都有分配的优先顺序。这些组合赋值运算符只能对标量进行操作,而普通赋值运算符可以对数组、散列、列表甚至引用进行赋值。 (请参阅 perldata 中的“上下文”和“列表值构造函数”,以及 perlref 中的“分配给引用”。)
答案2
您原来的代码示例是 Perl(5),还是实际上的 Perl6,又名 Raku?
2000 年,Perl 人士宣布雄心勃勃地重写 Perl 语言,目前版本为 5.6.0。新版本 (Perl6) 预计不会向后兼容 Perl5,自 2015 年发布 Rakudo 编译器以来,该计划已在实践中得到落实:Perl6(又名 Raku)和 Perl5 是不同的语言。
Perl6 于 2019 年更名为 Raku。
Perl5 中的点.
表示字符串连接,但在 Perl6/Raku 中它进行了重大修改。与其他语言类似,Perl6/Raku 有点.
表示方法链。因此,以下 Perl6/Raku 代码字符串(无双关语)三种方法与.
点运算符一起使用:
在 Raku REPL 中:
admin@mbp ~ % raku
Welcome to Rakudo™ v2022.07.
Implementing the Raku® Programming Language v6.d.
Built on MoarVM version 2022.07.
To exit type 'exit' or '^D'
[0] > (1..10).grep( * %% 2).reverse.put;
10 8 6 4 2
[ 这对于 Per6/Raku 中的字符串连接意味着什么?字符串连接现在是通过~
波形符运算符完成的,~=
Perl6/Raku 中的.=
from/in Perl(5) ] 也是如此。
无论如何,因为 Perl6/Raku 中的字符串连接和方法链接是不同的,所以对于那些来自其他语言的人来说,混淆较少。
现在关于该.=
运算符:
在 Perl6/Raku 中,=
是普通的赋值运算符。要在 Perl6/Raku 中声明变量,通常使用my
(或our
) 关键字。
[1] > my $x = 'apple banana carrot';
apple banana carrot
声明后,您可以 1. 调用方法并 2. 使用以下命令重新分配新值.=
:
[2] > $x .= uc;
APPLE BANANA CARROT
上面的代码相当于:
[2] > $x = $x.uc;
APPLE BANANA CARROT
不用说,您将看到在内存等方面的最大节省,快速更新/覆盖较大的对象(如数组):
[3] > my @array = 1..100;
[1 2 3 4 5 6 7 8 9 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100]
[4] > @array.grep: *.is-prime;
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)
[5] > put @array;
[1 2 3 4 5 6 7 8 9 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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100]
上面,@array
保留其原始值,直到您覆盖它:
[6] > @array .= grep: *.is-prime;
[2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97]
[7] > put @array;
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
http://blob.perl.org/perlweb/dev/perl6/talks/2001/dconway-Perl6.pdf
https://docs.raku.org/language/operators#infix_.=
https://docs.raku.org/language/operators#methodop_.=
https://raku.org