2. Perl6-変数の操作、匿名ブロック
3. Perl6-条件付きステートメント、ループ
機能の使用を検討する時が来ました。 このトピックでは、名前付きパラメーターやスクリプトでメイン関数を作成する機能など、Perl6にいくつかの変更がありますが、順番に始めましょう。
Perl6は関数を構成体として宣言します
sub SubName($a, $r, $g, $s) { //SomeWork }
受信したパラメータのタイプを指定することが可能です
sub SubName(Int $a) { SomeWork(); }
ただし、関数が異なるタイプの引数で呼び出されると、スクリプトはエラーで停止します。 また、渡される引数の数は、関数を宣言するときの引数の数と一致する必要があります。
関数呼び出しは、構造を使用して行われます。
f(10, True, "str", {say "closure";}); f 20, False, "aaa", 9.999;
C ++の場合と同様に、関数のオーバーロードを実行できますが、関数ごとに「multi」という単語を追加する必要があります。
multi sub f(Int $a) {say 'Int';}; multi sub f(Str $a) {say 'Str';}; f("string"); f(100500);
その結果、画面に表示されます:
Str Int
関数のスコープを示すために、単語myおよびourが使用されます-それぞれ、関数が宣言された領域の可視性とグローバルスコープ。
関数によって返される値のタイプを指定できます。
my Int sub func($a) {return $a+1;}
指定された型と宣言中に指定された戻り値の型が操作中に一致しない場合、スクリプトは型の不一致に関するエラーで停止します。
オプションで、これらのパラメーターを関数内で変更できるかどうか、関数のパラメーターを指定できます。
sub f($a is rw) { $a*=10; } my $z = 5; f($z); say $z;
結果は50になります
また、概要では、関数が左辺値を返すことができることが示されています。
my $b = 10; sub f() is rw { return $b; } f() = 5; say $b;
その結果、5という数字が画面に表示されますが、最新バージョン(12.09)では、左辺値を使用する可能性はまだ用意されておらず、私の場合はコンパイル中にエラーが発生しました。
Perl6では、名前付きパラメーターを使用する機能が導入されています。
my sub func(:$name1, :$name2, :$name3) { say $name1, ' ', $name2, ' ', $name3; } my $a = 10; func :name2<text2>, :name1<1+2+$a>, name3=>$a; my %hash = {name3=>'text3', name2=>'text2', name1=>'text1'}; func |%hash;
その結果、画面には以下が表示されます。
1+2+$a text2 10 text1 text2 text3
パラメータとしてハッシュではなく%ハッシュを渡すと、関数はそれを位置引数として受け入れます。この場合、関数には位置要素がないため、スクリプトは失敗します。
また、construct:arg($ value)を使用して、名前付き引数を指定することもできます。 このオプションと:arg <$ value>の違いは、2番目のケースでは変数の値が置換されないことです。その結果、最初のケースでは変数$ valueの値を取得し、2番目のケースでは文字列 '$ value'を取得します。
さらに、オプションのパラメーターを使用できます。
sub HaveArgument($arg?) { if $arg.defined { say 'yes'; } else { say 'no'; } } HaveArgument; HaveArgument 10;
その結果、次の行を取得します
no yes
perl5のように、可変数の引数を持つ関数を作成するには、次の構成を使用できます。
sub Counter(*@arg) { say @arg.elems; } Counter(1, 2, 3); Counter;
その結果、2つの数字が表示されます:3と0
* @ argsの前に位置要素を指定できます。
sub Counter($a, *@arg) {...}
メイン機能:
Perl6では、C ++に似たMAIN関数を作成する機能が導入されましたが、いくつかの違いがあります。 たとえば、関数の本体の外側で、他の関数を呼び出すことができます。これらの呼び出しは、MAIN関数が実行を開始する前に行われます。
sub MAIN() { say "MAIN!"; say "Hello!"; } say "123!";
その結果、画面に線が表示されます
123! MAIN! Hello!
また、MAIN関数では、入力パラメーターを指定できます。これは、実行のためにスクリプトを呼び出すときに必須パラメーターになります。
スクリプトの内容:
sub MAIN($arg1, $arg2) { say "MAIN!"; say $arg1, ' ', $arg2; } say "123!";
そして、パラメーターなしでスクリプトを呼び出すと、結果として画面にテキストが表示されます。
123! Usage: /home/warfair/ /script.p6 <arg1> <arg2>
「123!」という関数が呼び出されたことに注意してください。これは、関数の本体の外側にあり、その後でのみMAIN呼び出しが失敗しました。
関数参照は、コンストラクトを使用して変数に保存できます
sub MySub() {...}; my $var = &MySub;
匿名関数を作成し、それらへの参照をスカラー変数に保存できます。
my $r = sub ($a) { return $a*2; } say $r(2);
その結果、4が表示されます