Perl入学式第2回目をPerl6で解いてみる(Part1)

皆さんこんにちは.最近はようやく寒くなってきた沖縄からid:anatofuzです.

そういえばYAPC::Tokyoのチケットはまだ売っている様です.皆さん行きましょう.

yapcjapan.org

今日は雰囲気でPerl6でPerl入学式第2回の構文基礎を書いていこうと思います

Perl6とは

Perl6とはPerlっぽい別言語です. Python2とPython3の関係ではないので注意しましょう.

とは言え,最初にエイヤッとした言語デザイナーがLarryWallでもありますし, 幾つかのSyntaxはPerlに似ています.

Hello,World!

print "Hello, World!\n"; このように書いたものを, hello.plとして保存します printは, 端末に文字を出力します \nは改行を表します 最後に;を忘れずに!

Perl6ではprintもありますが,よく使うのはsayです.

say "Hello,World!";

ちなみに他にこういうやり方もあります

"Hello,World!\n".print;

これはMuクラスに生えているprintメソッドを利用した場合です. https://docs.perl6.org/routine/print

perl5までのprintはIOクラスのメソッドとなっています

print "Hello,World!\n";

もちろんsayもメソッドとして生えているので出来ます

"Hello,World!".say;

おまじない

!/usr/bin/env perl

use strict; use warnings; おまじないとして, 冒頭の3行を書くようにしよう use strict -> 厳密な書式を定めたり, 未定義の変数を警告するといった効果があります use warnings -> 望ましくない記述を警告してくれる効果があります 以下, この資料のサンプルコードではこれを「お約束」として省略します 書かれているものとして扱ってください

Perl6ではstrictやwarningsの様なものは標準で入っています. この代わりのおまじないと言えば,シェバングと次の1行が該当するでしょうか.

#!/usr/bin/env perl6
use v6;

このv6とはPerl5で仮にこのPerl6プログラムを実行した際にエラーを出してくれるというものです. Perl6的には特に害が無いです. https://docs.perl6.org/language/101-basics#v6

例えば次の様なスクリプトを書いたとしましょう.

use v6;
print "hoge\n";

2行目に関してはPerl5でもprintがあるので,実行することが可能ですが, 仮に他の処理があると予期せぬ処理をPerl5がしそうです. 現在のPerl6では普通のスクリプトの拡張子をp6, クラス定義などのモジュールになるファイルの拡張子をpm6とすることを推奨していますが,Perl5と同じplが拡張子として使われている場合もあります. このプログラムは use v6; をしているので, Perl6で実行すると次のようなエラーを出します.

~/.sandbox » perl hoge.p6
Perl v6.0.0 required--this is only v5.26.2, stopped at hoge.p6 line 1.
BEGIN failed--compilation aborted at hoge.p6 line 1.

という訳で1行読み込んで終わりました.安全性のために書いておくのがオススメです.

復習問題

Hello, Perl Entrance!という文字列を出力するhello_perl.plを書いて下さい

say "Hello, Perl Entrance!";

構文チェック

perl6では perl -c hoge.p6 とするといい感じになります.

~/.sandbox » perl6 -c hoge.p6
Syntax OK

スカラ変数

Perl6はPerl5と似ており,スカラ,配列,ハッシュの3タイプに変数が分類されます.

Perl6のドキュメントによると次の様に書かれています https://docs.perl6.org/type/Scalar

A Scalar is an internal indirection which is for most purposes invisible during ordinary use of Perl 6. It is the default container type associated with the $ sigil. A literal Scalar may be placed around a literal value by enclosing the value in $(…). This notation will appear in the output of a .perl method in certain places where it is important to note the presence of Scalars.

When a value is assigned to a $-sigiled variable, the variable will actually bind to a Scalar, which in turn will bind to the value. When a Scalar is assigned to a $-sigiled variable, the value bound to by that Scalar will be bound to the Scalar which that variable was bound to (a new one will be created if necessary.)

In addition, Scalars delegate all method calls to the value which they contain. As such, Scalars are for the most part invisible. There is, however, one important place where Scalars have a visible impact: a Scalar will shield its content from flattening by most Perl 6 core list operations.

A $-sigiled variable may be bound directly to a value with no intermediate Scalar using the binding operator :=. You can tell if this has been done by examining the output of the introspective pseudo-method .VAR:

雰囲気で理解すると,Perl6におけるスカラ型は $ で宣言した変数名と,実際の値をバインドしてくれる中間的なクラスであり,$ で宣言すると自動的に全てスカラになるということの様です.

また := を利用することで,間にスカラクラスを挟まず,ダイレクトに値を束縛することが可能です.

とは言え,基本的にはPerl5と同じ扱いですが,実際に型として利用されるのはバインドされている変数ということの様です.

これは公式ドキュメントによると次の様に見ることが可能です.

my $a = 1;
$a.^name.say;     # OUTPUT: «Int␤»
$a.VAR.^name.say; # OUTPUT: «Scalar␤»
my $b := 1;
$b.^name.say;     # OUTPUT: «Int␤»
$b.VAR.^name.say; # OUTPUT: «Int␤»

.^name で変数の型が確認できます. $a では1をスカラクラス経由でバインドしており,基底にScalarがあることがわかります.

一方 $b は1を束縛している為,アイテム化されておらず,$b そのものがIntであることがわかります.

Perl6では $ があるかないかでScalarクラスであるかどうかが変わります.

.say for (1, 2, 3);           # OUTPUT: «1␤2␤3␤», not itemized
.say for $(1, 2, 3);          # OUTPUT: «(1 2 3)␤», itemized
say (1, 2, 3).VAR ~~ Scalar;  # OUTPUT: «False␤»
say $(1, 2, 3).VAR ~~ Scalar; # OUTPUT: «True␤»

上の例を見ると $ があるかないかで変わっていることがわかりますね. この $(1,2,3) はアイテム化されているといい, $(1,2,3) でひとまとめです.

その為 $(1,2,3) は実はこうなります.

> my @hoge = $(1,2,3);
[(1 2 3)]
> say @hoge
[(1 2 3)]
> @hoge[0]
(1 2 3)
> @hoge[0][0]
1

アイテム化されている為,実は $(1,2,3) はスカラであり,その中の要素はリストなので配列のようにアクセスするというPerl5っぽい挙動を示します.

コメント

Perl6のコメントはPerl5と同じく# です

# こうするとコメント

またPerl6ではMulti-line commentも追加されました

"#`" とカッコでくくると,その間がコメントとなります.

if #`( why would I ever write an inline comment here? ) True {
    say "something stupid";
}

この例では #`の後に ( が来ているので,この中が全部コメントとなり 最終的にはif True { という感じに解釈されます.

$perl6 hoge.p6
something stupid

これは結構便利ですね!!

疲れたので続きは次回...