スキップしてメイン コンテンツに移動

Perl 5 to 6 - 文字列、配列、ハッシュ

これは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

コメント

このブログの人気の投稿

Perl 5 to 6 - コンテキスト

2011-02-27: コメント欄で既に改訂された仕様の指摘がありました ので一部補足しました。 id:uasi に感謝します。 これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 06 - Contexts の日本語訳です。 原文は 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 06 - コンテキスト SYNOPSIS my @a = <a b c> my $x = @a; say $x[2]; # c say (~2).WHAT # Str() say +@a; # 3 if @a < 10 { say "short array"; } DESCRIPTION 次のように書いたとき、 $x = @a Perl5では $x は @a より少ない情報—— @a の要素数だけ——しか持ちません。 すべての情報を保存しておくためには明示的にリファレンスを取る必要があります: $x = \@a Perl6ではこれらは反対になります: デフォルトでは何も失うことなく、スカラ変数は配列を単に格納します。 これは一般要素コンテキスト(Perl5で scalar と呼ばれていたもの)及びより特化された数値、整数、文字列コンテキストの導入によって可能となりました。無効コンテキストとリストコンテキストは変更されていません。 特別な構文でコンテキストを強制できます。 構文 コンテキスト ~stuff 文字列 ?stuff 真理値 +stuff ...

Perl 5 to 6 - ツイジル

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 15 - Twigils の日本語訳です。 原文は 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 15 - ツイジル SYNOPSIS class Foo { has $.bar; has $!baz; } my @stuff = sort { $^b[1] <=> $^a[1]}, [1, 2], [0, 3], [4, 8]; my $block = { say "This is the named 'foo' parameter: $:foo" }; $block(:foo<bar>); say "This is file $?FILE on line $?LINE" say "A CGI script" if %*ENV.exists('DOCUMENT_ROOT'); DESCRIPTION いくつかの変数にはツイジルという第2のシジルがあります。これは基本的にはその変数が「普通」ではないということです。違いはいくつかあり、例えばスコープの違いなどです。 オブジェクトのパブリックな属性とプライベートな属性がそれぞれ . と ! というツイジルを持つことは既に紹介しました; それらは通常の変数ではなく self に結びつけられています。 ツイジル ^ はPerl5で例外的に扱われていたケースを一般化します。次のように書けます # 注意: Perl5のコードです sort ...

多分週刊チラシの裏 (Sep 28 - Oct 04, 2020)

Chrome Web Store が有料 Chrome 拡張の取扱を終了 Chrome Web Store で提供されている有料 Chrome 拡張及びアプリ内課金 API の両方が 2021 年 1 月いっぱいで廃止される。 開発者はそれまでに代替となるサードパーティの課金 API に移行し、購入済ライセンスの移行手段も用意する必要がある。 この決定の発表時点で新規の有料ないしアプリ内課金のある Chrome 拡張の新規登録は終了している。実際のところ 2020 年 3 月時点で既に「一時的に」停止されており、その措置が恒久化されただけとの由。 シェルスクリプティングには長いオプションを使え 「短いオプション (e.g., -x ) はコマンドライン上での略記である。スクリプトにおいては自分や将来の同僚のためにも長いオプション (e.g., ---do-something ) を与える方が理解が容易だろう」という主張。 異論の余地なく正論である。 CobWeb - COBOL to WebAssembly Compiler COBOL から WebAssembly へのコンパイラ。いやマジで。 Cloudflare が何を思ったか同社のサーバレス環境である Workers に COBOL 対応を追加した際 の成果物である。 COBOL から C へのトランスレータである GNU COBOL と C コードをコンパイルして WebAssembly を出力する Emscripten から成っており、他の言語に比べて軽量なバイナリを生成するとのこと。 「ウチではそんな風にはやらないんだ (“We don’t do that here”)」 昨今ソフトウェア開発のコミュニティでも Code of Conduct を用意するところが増えてきたが、コミュニティの文化を明文化するのは難しい。 長大な「べからず集」は息苦しいし、肯定的なガイドラインは時に抽象的で実効的に使えない。問題となるようなふるまいの動機が善意であった場合は特にそうだ。 仮に優れたガイドラインがあっても、それに基いて人を実際に咎めるのは骨が折れることである。初中やればコミュニティ内でも疎まれる。 話の分かる相手ならそれでもまだ説得する意義もあるが、Web 上の対話で当事者双方が納得し合っ...

LIBLINEAR 2.41 で One-class SVM が使えるようになったので Perl から触ってみよう

改訂 (Sep 15, 2020): 必要のない手順を含んでいたのでサンプルコードと記述を修正しました。 CPAN に Algorithm::LibLinear 0.22 がリリースされました (しました。) 高速な線形 SVM およびロジスティック回帰による複数の機械学習アルゴリズムを実装したライブラリである LIBLINEAR への Perl バインディングです。 利用している LIBLINEAR のバージョンが LIBLINEAR 2.30 から LIBLINEAR 2.41 に上がったことで新しいソルバが追加され、One-class SVM (OC-SVM) による一値分類が利用可能になっています (しました。) OC-SVM って何 一値分類を SVM でやること。 一値分類って何 ある値が学習したクラスに含まれるか否かを決定する問題。 HBO の「シリコンバレー」に出てきた「ホットドッグ」と「ホットドッグ以外」を識別するアプリが典型。「ホットドッグ以外」の方は犬でも神でも一つの指輪でも何でも含まれるのがミソ。 二値分類の場合正反両者のデータを集める必要があるのに対して、一値分類の学習器は正例データのみしか要求しない (ものが多い。) 主な用途は外れ値検出で、もちろんホットドッグやホットドッグ様のものを検出したりもできる。 使い方 手順自体は他の二値ないし多値分類問題と同じです。つまり、 訓練パラメータを決めて 訓練データセットで訓練して テストデータセットで確度を検証して 十分良くなったらモデルを保存する といういつもの流れ。 訓練パラメータ use 5.032 ; use Algorithm::LibLinear ; my $learner = Algorithm::LibLinear ->new( epsilon => 0.01 , nu => 0.75 , solver => ' ONECLASS_SVM ' , ); solver => 'ONECLASS_SVM' が一値分類用のソルバです。LIBLINEAR の train コマンドで言うところの -s 21 。 OC-SVM の良いところは (ハイパー)...

Perl 5 to 6 - Perl5の演算子に対する変更

これはMoritz Lenz氏のWebサイト Perlgeek.de で公開されているブログ記事 "Perl 5 to 6" Lesson 11 - Changes to Perl 5 Operators の日本語訳です。 原文は 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 11 - Perl5の演算子に対する変更 SYNOPSIS # ビット演算子 5 +| 3; # 7 6 +^ 3 # 6 5 +& 3; # 1 "b" ~| "d" # 'f' # 文字列連結 'a' ~ 'b' # 'ab' # ファイルテスト if '/etc/passwd' ~~ :e { say "exists" } # 繰り返し 'a' x 3 # 'aaa' 'a' xx 3 # 'a', 'a', 'a' # 3項演算子 $a == $b ?? 2 * $a !! $b - $a # 連結比較 if 0 <= $angle < 2 * pi { ... } DESCRIPTION 数値演算子( + , - , / , * , ** , % )はすべて元のままです。 | 、 ^ 、 & はジャンクションの生成に使われるので、ビット演算子は構文が変更されました。 それらはデータプレフィクスを伴い、例えば ...