前の記事で、変数を操作する機能について説明し、コンテキストについても触れました。 この記事では、変数の使用に関する実験と検索の結果を共有し、匿名コードブロックの機能についても簡単に説明します。
さあ始めましょう
Perl6では、宣言時に変数の型を指定できます。
例:
my Int $var;
この宣言では、番号のみを$ var変数に割り当てることができます。 文字列または別の型を変数に割り当てようとすると、自動型変換は実行されません-型チェックに関するエラーでスクリプトが停止します。 型は、ユーザークラスを含む既存のデータ型にすることができます。
特別な制限なしに、指定したタイプから他のタイプに変換できます。
このような変数の宣言では、初期値はInt()になり、この値は使用できません-これは、コンストラクターが自動的に呼び出されず、変数が指定された型の未定義の値を受け取るために発生します。 変数を宣言するときにオブジェクトの新しいインスタンスを作成するには、コンストラクトを使用できます
my SomeClass $x .= new(a,r,g,s); my $x = SomeClass.new(a,r,g,s);
定義されたメソッドを使用して、変数に値があるかどうかを確認できます。
my Int $x; say $x.defined; #False
タイプを指定する別の方法は、構築することです
my $x is Int;
ただし、最後に、現時点(12.09)のRakudo-starのバージョンでは、この方法はまだ機能しません。
タイプを指定する次の方法も可能です。
my Array of Array of Int @x;
ただし、(12.09)では機能しないため、この方法の機能については何も言えません。
主な操作に移りましょう-もちろん、このリストは完全ではありませんが、使用する主な操作のリストを示します。
- 数字による操作:
- 典型的なバイナリおよび単項演算
これらは操作+、-、*、/です。
上記に加えて、除算の残りの部分(%、mod)、累乗(**)、増分および減分(++、-)、除算の整数部分(div)の操作を使用できます。
- ビット演算:ビット演算「AND」(+&)、ビット演算「OR」(+ |)、ビット演算シフト(+ <、+>)、ビット演算「XOR」(+ ^)
- 比較操作:== 、! =、<、>、> =、<=。
- 典型的なバイナリおよび単項演算
- 文字列操作:
2本の線の接着
('a'~'b')
行をn回繰り返す('a' x 10)
文字列の比較:文字列は等しい(eq)、等しくない(ne)、アルファベット順に、行1は行2の前(lt、before)、後(gt、後)、前または一致(le)、後または一致(gt)
- ブール型操作:
AND(?&)、OR(?|)、XOR(?^)、NOT(!)
- -ジャンクションの使用()
ジャンクションは、グループ比較のための特別なタイプです-書く場合
$a == any(1, 2, 3)
変数$ aがリストされた値の少なくとも1つに等しい場合、条件が満たされます。
可能な演算子
- any(
$a==1 or $a==2 or $a==3
) - すべて(
$a==1 and $a==2 and $a==3
) - 1($ aは指定された値の1つのみに等しい)、
- なし($ a!= 1および$ a!= 2および$ a!= 3)
-最大(max)または最小(min)数の決定
$a = 10 min 4; $b = 20 max 99;
オペランドとして文字列を使用する場合、比較はアルファベット順です。
-三項演算子
$ifValue ?? "yes" !! "no"
最初のオペランドはブール型に変換され、値がtrueの場合は2番目のオペランドが返され、そうでない場合は3番目のオペランドが返されます。
-メタ演算子の使用
配列の各要素に特定の操作を適用することが可能です:
@a = (1, 2, 3); @b = @a X* 2; # 2, @c = @a X** 2; #
-すべてのアイテムを選択
配列のすべての要素に対して操作を実行するために、>> operator >>構文が使用されます
@a = 1, 2, 3; @b = @a>>**>>2, 100, 500;
この式では、@ a配列のすべての要素が2乗され、新しい配列が作成され、結果の配列に2つの数値が追加されます:100および500
その結果、@ b配列には(1, 4, 9, 100, 500)
1、4、9、100、500)が含まれます
-Zipオペレーター
2つの配列から要素をペアで選択するために使用されます。
@a = (1, 2, 3); @b = (4, 5, 6); @c = @a Z @b; #(1, 4, 2, 5, 3, 6)
演算子レコードの短い形式
すべての番号を追加するには、エントリ[+]を使用できます
@a = 1, 2, 3; $a = [+] @a;
結果は$ a = 1 + 2 + 3です。
エイリアスを作成する
変数の場合、変数の2番目の名前と見なされるエイリアスを作成できます。 変数はメモリ内の同じ領域を指しているため、1つの変数名による変更は2番目の変数名でも表示されます。 エイリアスの作成は「:=」として示されます
$a = 1; $b := $a;
不変変数を作成する
不変変数を作成するには、たとえば演算子「:: =」を使用します
my $a ::= "aaa";
ただし、現在のバージョン(12.09)では、このようなアナウンスによりコンパイルエラーが発生します。
変数参照を取得する
「\」を使用して変数へのリンクを取得できます。
$a = 10; $b = \$a;
- any(
ブロックについて:
Perl 6のブロックはデータとして使用できます。個々のブロックをスカラー変数に割り当てて実行できます。
$b = 10; $a = { $b = 1; }; $a(); say $b; # $b=1;
ブロックが実行のために呼び出されると、呼び出しの結果はこのブロックで最後に計算された値になります。 この例では、計算値は定数1です。ブロック内では、ブロックの操作を終了するためにreturnステートメントを使用することはできません。ブロックが呼び出される関数の実行を完了します。
ブロックは、関数呼び出しの引数として使用できます。
func($arg1, $arg2, { say 'this is a block'; });
変数はブロック内で宣言することも、既存の変数を再定義することもできます。ブロックは変数のスコープを設定し、ブロック内で宣言された変数の変更は、このブロック外の同じ名前の変数には影響しません。
次のコードで
my $a = ' '; my $closure = { say $a; }; { my $a = ' '; $closure(); }
行の「変数の初期値」が表示されます。 $クロージャー変数を作成するとき、グローバルスコープで宣言された変数が使用され、ブロック内で同じ名前の変数を定義した後でも、最初の変数が使用されます。
次のコードでは、表示されている場所からアクセスできなくなった場合でも、ブロックのローカル変数$ aが使用されます。
my $a = ' '; my $closure; { my $a = ' '; $closure = { say $a; }; } $closure();