语法 .= 在 perl 中意味着什么

语法 .= 在 perl 中意味着什么

我遇到了一个 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

相关内容