構文.= Perlでは、これはどういう意味ですか?

構文.= Perlでは、これはどういう意味ですか?

次の.=構文を使用するPerlスクリプトを見つけました。

$key .= $descriptions[$i];

ここで .= とはどういう意味ですか?

答え1

.=Cでは、.あなたが好きなものです。+=+

$a += 4;

ように:

$a = $a + 4;
$a .= "x";

ように:

$a = $a . "x";

ほとんどのキャリアと同じです。

.それ自体は文字列連結演算子なので、$key .= $descriptions[$i];追加は次の$descriptions[$i]より短く効率的です。

$key = $key . $descriptions[$i];

または

$key = "$key$descriptions[$i]";

すべての演算子と同様に、対応する説明は次のとおりですperldoc perlop

代入演算子

「=」は一般的な割り当て演算子です。

代入演算子は C 言語と同じように動作します。今すぐ、

 $x += 2;

等しい

 $x = $x + 2;

"tie()" のような lvalue 逆参照によって引き起こされる可能性のある副作用は繰り返されません。他の代入演算子も同様に機能します。以下が認識されます。

 **=    +=    *=    &=    &.=    <<=    &&=
        -=    /=    |=    |.=    >>=    ||=
        .=    %=    ^=    ^.=           //=
              x=

これらは家具ごとにグループ化されていますが、すべて優先順位が付けられています。これらの結合割り当て演算子はスカラーでのみ機能できますが、通常の割り当て演算子は配列、ハッシュ、リスト、および参照にも割り当てることができます。 (perldataの「コンテキスト」と「リスト値コンストラクタ」とperlrefの「参照に割り当てる」を参照してください。)

答え2

元のコード例はPerl(5)ですか、それとも実際にRakuとも呼ばれるPerl6ですか?

2000年に、Perlの人々は現在バージョン5.6.0のPerl言語の野心的な書き換えを発表しました。新しいバージョン(Perl6)は、2015年のRakudoコンパイラのリリース以降に実際に実装された計画であるPerl5と以前のバージョンと互換性がないと予想されます。 Perl6(別名Raku)とPerl5は異なる言語です。

Perl6は2019年にRakuに名前が変更されました。

Perl5の点は.文字列連結を表しますが、Perl6/Rakuでは大きく修正されました。他の言語と同様に、Perl6 / Rakuは次の表現をある程度.表現します。メソッドチェーン。したがって、次のPerl6 / Rakuコード文字列(不意の意図なし)は、.点演算子と一緒に3つの方法を使用します。

楽 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 の 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/言語/operators#infix_.=
https://docs.raku.org/言語/operators#methodop_.=
https://raku.org

関連情報