これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 01 - Strings, Arrays, Hashes;の日本語訳です。
原文はCreative Commons Attribution 3.0 Germanyに基づいて公開されています。
本エントリにはCreative Commons Attribution 3.0 Unportedを適用します。
Original text: Copyright© 2008-2010 Moritz Lenz
Japanese translation: Copyright© 2011 SATOH Koichi
NAME
"Perl 5 to 6" Lesson 01 - 文字列、配列、ハッシュ
SYNOPSIS
my $five = 5;
print "an interpolating string, just like in perl $five\n";
say 'say() adds a newline to the output, just like in perl 5.10';
my @array = 1, 2, 3, 'foo';
my $sum = @array[0] + @array[1];
if $sum > @array[2] {
say "not executed";
}
my $number_of_elems = @array.elems; # or +@array
my $last_item = @array[*-1];
my %hash = foo => 1, bar => 2, baz => 3;
say %hash{'bar'}; # 2
say %hash<bar>; # 自動クォートを使った例
# これはエラーになる: %hash{bar}
# (宣言されていないサブルーチンbar()を呼び出そうとする)
DESCRIPTION
Perl6はPerl5と良く似ています――より良いだけです。 文はセミコロンで終端します。ブロックの最後の文と、行の最後の閉じ中カッコの後では省略可能です。
変数は相変わらず($
、@
、%
のような)シジル(Sigil)で始まりますし、多くのPerl5組み込み関数はPerl6でも変更されていません。
文字列
文字列はダブルクォート(変数展開する場合)かシングルクォートで囲みます。バックスラッシュのエスケープはPerl5と同様に作用します。
ただし変数展開の規則は少し変更されました。以下のものは展開されます。
my $scalar = 6;
my @array = 1, 2, 3;
say "Perl $scalar"; # 'Perl 6'
say "An @array[]"; # 'An 1 2 3', 禅スライス(Zen slice)とも呼ばれる
say "@array[1]"; # '2'
say "Code: { $scalar * 2 }" # 'Code: 12'
配列とハッシュは添字(あるいはカッコが付いた"some $obj.method()"
のような関数呼び出し)が付いた場合のみ展開されます。空の添字はデータ構造全体を展開します。
中カッコの中のブロックはコードとして実行され、結果が文字列中に展開されます。
配列
配列変数は相変わらず@
シジルで始まります。
格納された要素にアクセスするとき、例えば添字が1つ与えられた場合であってもそのままです。
my @a = 5, 1, 2; # カッコは必要なくなりました
say @a[0]; # そう、@で始まるんです
say @a[0, 2]; # スライスも使えます
リストはカンマ演算子で生成されます。1,
はリストですが、(1)
は違います。
何もかもがオブジェクトなので、配列に対してメソッド呼び出しができます:
my @b = @a.sort;
@b.elems; # 要素数
if @b > 2 { say "yes" } # まだ動く
@b.end # 末尾要素のインデックス。$#arrayの代替
my @c = @b.map({$_ * 2 }); # mapはメソッドにもあります
従来のqw(...)
クォート生成の略記法があります:
my @methods = <shift unshift push pop end delete sort map>;
ハッシュ
Perl5のハッシュはリストコンテキストでは偶数サイズのリストでしたが、Perl6のハッシュはペアのリストです。 ペアはサブルーチンの名前付き引数のような他の使い道もありますが、それについてはもっと後で出てきます。
配列同様シジルは添字を指定したときも変わりませんし、ハッシュに対して呼び出せるメソッドもあります。
my %drinks =
France => 'Wine',
Bavaria => 'Beer',
USA => 'Coke';
say "The people in France love ", %drinks{'France'};
my @countries = %drinks.keys.sort;
%hash{...}
でハッシュの要素にアクセスするとき、キーがPerl5のように自動でクォートされない点に注意して下さい。
%hash{foo}
は添字"foo"
にアクセスせず、関数foo()
を呼び出します。
自動クォートはなくなったわけではなく、構文が変更されました:
say %drinks<Bavaria>;
おわりに
ほとんどの組み込み関数はメソッドとサブルーチンの両方があるので、sort @array
とも@array.sort
とも書くことができます。
最後に[...]
と{...}
(項の直後に出てくるもの)は特別な構文のメソッド呼び出しに過ぎず、配列やハッシュに結びついてはいないことを覚えておいて下さい。つまりこれらは、特定のシジルにも結びついていないということです。
my $a = [1, 2, 3];
say $a[2]; # 3
これはつまり、デリファレンスのための特別な構文が必要ないということ、また配列やハッシュ、サブルーチンとして同時にふるまうようなオブジェクトが作れるということです。
SEE ALSO
http://perlcabal.org/syn/S02.html, http://perlcabal.org/syn/S29.html
コメント
コメントを投稿