Upgrade to Pro — share decks privately, control downloads, hide ads and more …

他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019

utagawa kiki
November 03, 2019

他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019

YAPC::Nagoya::Tiny 2019

utagawa kiki

November 03, 2019
Tweet

More Decks by utagawa kiki

Other Decks in Programming

Transcript

  1. 他言語ユーザから見た
    Perlのおもしろさ
    YAPC::Nagoya::Tiny 2019
    うたがわきき ([email protected])

    View Slide

  2. うたがわきき (@utgwkk)
    京都から来ました
    KMC (京大マイコンクラブ)
    はてなサマーインターン2019
    はてなアルバイトエンジニア

    View Slide

  3. 「他言語ユーザから見た」
    もともとPython3をよく書いていた
    インターン・アルバイトでPerlを書きはじめた
    いち他言語ユーザがPerl (それをとりまくものたち) の
    どんなところが面白いと思ったのかご紹介

    View Slide

  4. プログラミング言語界
    Perl
    Ruby
    Python
    Go JavaScript
    Java
    C#
    Scala Common Lisp
    Rust
    C++
    Haskell

    View Slide

  5. プログラミング言語を構成するもの
    文法・意味
    言語処理系
    ドキュメント
    ライブラリ
    依存管理ツール
    コミュニティ
    パッケージデータベース
    論文
    などなど

    View Slide

  6. 比べることでより見えてくるもの
    思想
    歴史的経緯
    イケてる点
    イケてない点
    特化した分野
    コミュニティの空気感
    おもしろさ

    View Slide

  7. 本日のトピック
    おもしろいなと思ったものたちをご紹介
    変数宣言
    コンテキストとハッシュ
    関数と引数
    リファレンスとオブジェクト指向
    CPANと名前空間
    DESTROYメソッド
    VSCodeとPerl

    View Slide

  8. 変数宣言
    my は組み込み関数
    変数のスコープを定める
    use strictしてたらmyなどを通さないと静的にエラー
    静的検査!!!
    my $x;

    View Slide

  9. コンテキスト
    my @arr = (20, 30);
    my $x;
    $x = @arr; # $x == 2
    $x = scalar @arr; # $x == 2
    ($x) = @arr; # $x == 20
    wantarray
    コンテキストによって評価結果が変わる

    View Slide

  10. ハッシュ
    my %hash = (
    foo => 10,
    bar => 20,
    );
    $hash{foo}; # => 10
    ハッシュテーブルとか辞書とか
    確かにそれっぽい

    View Slide

  11. ハッシュ?
    my %hash = (
    foo => 10,
    bar => 20,
    );
    my (@a) = %hash;
    @a; # => ('foo', 10, 'bar', 20)
    ン?!

    View Slide

  12. ハッシュ??
    my @arr = ('foo', 10, 'bar', 20);
    my %hash = @arr;
    $hash{foo}; # => 10
    ハハーン…

    View Slide

  13. 関数定義
    sub func {
    # do something ...
    }
    引数は??

    View Slide

  14. 引数受け取り方いろいろ
    shift
    $_[0], $_[1]
    my ($a, $b) = @_
    my ($arg, %opts) = @_
    args my $a => 'Str'
    関数の引数情報を静的解析するの難しそう

    View Slide

  15. リファレンスその前に
    2行2列の行列
    ❌これは正しくない!!
    リストは入れ子にできない
    平坦化される
    my @matrix = (
    (1, 2),
    (3, 4),
    ); # @matrix == (1,2,3,4)
    $matrix[1][1] # => undef

    View Slide

  16. リファレンス
    my $matrix = [
    [1, 2],
    [3, 4],
    ];
    $matrix->[1]->[1] # => 4
    2行2列の行列
    ⭕これは正しい

    View Slide

  17. リファレンス
    ハッシュリファレンス
    my $hashref = {
    foo => 10,
    bar => 20,
    };
    $hashref->{foo}; # => 10

    View Slide

  18. そういえばPythonでも
    matrix = [
    [1, 2],
    [3, 4],
    ]
    matrix[1][1] # => 4
    dic = {
    'foo': 1,
    'bar': 2,
    }
    dic['foo'] # => 1
    どちらも参照でしたね

    View Slide

  19. オブジェクト指向
    道具は(ほぼ)揃ったのでオブジェクト指向やるぞ!!

    View Slide

  20. Perlのオブジェクト指向
    package Foo;
    sub new {
    my ($class, $hoge) = @_;
    bless +{hoge => $hoge};
    }
    sub hoge { shift->{hoge}; }
    1;
    use Foo;
    my $foo = Foo->new(5);
    $foo->hoge; # => 5

    View Slide

  21. Perlのオブジェクト指向
    package宣言がそのままクラス名ぽい感じに
    ハッシュリファレンスをblessでインスタンス作成
    コンストラクタ名はnewじゃなくてもよい
    use (require) が成功したら真を返す必要がある
    $obj->foo でメソッド呼び出し
    手作り感ある

    View Slide

  22. CPANと名前空間
    名前空間文化よさそう
    Test→テストに使うやつ とすぐわかる
    Pythonでは名前からぱっと分かるとは限らない
    みんなが好きに名前を付ける
    Acmeモジュール文化おもしろい
    名前空間が分かれてるのでどんどん遊べる

    View Slide

  23. Try::Tiny
    use Try::Tiny;
    my $filename = 'notfound';
    try {
    open my $out, $filename
    or die "Cannot open $filename";
    } catch {
    print STDERR "!!!!!!ERROR!!!!!!!\n";
    print STDERR $_;
    }
    モダンな例外処理ぽい
    try,catchっていう関数に
    ブロック渡してる

    View Slide

  24. Scope::Guard
    use Scope::Guard;
    open my $in, '/tmp/hoge';
    my $guard = guard { close $in };
    # do something ...
    用が済んだら close $in が呼ばれる

    View Slide

  25. これってあれですよね
    import "os"
    func main() {
    file, err := os.Open("/tmp/hoge")
    if err != nil {
    panic(err)
    }
    defer file.Close()
    // do something ...
    }

    View Slide

  26. これってあれですよね
    with open('/tmp/hoge') as f:
    content = f.read()
    withを抜けるとf.close()が呼ばれる
    closeし忘れを防ぐ

    View Slide

  27. Scope::Guard
    use Scope::Guard;
    open my $in, '/tmp/hoge';
    my $guard = guard { close $in };
    # do something ...
    $guard は何?

    View Slide

  28. sub DESTROY
    いわゆるデストラクタ
    オブジェクトが回収されると呼ばれる
    デストラクタで設定を戻せば確かに忘れない
    新しい言語機能として実装せずに
    GCのついでによしなに処理が行われる空気感

    View Slide

  29. Perl with VSCode
    業務ではVSCodeでPerlを書いている
    拡張機能あるけどそんなに多くない
    "perl" 42個 (marketplaceでの検索結果)
    参考:
    "ruby" 120個
    "python" 211個
    "javascript" 1386個

    View Slide

  30. 最近の悩み
    VSCodeでPerlを書いている
    package宣言を毎回書かないといけない
    lib/Foo/Bar/Baz.pm → package Foo::Bar::Baz
    法則あるので自動化できない?

    View Slide

  31. PerlのVSCode拡張機能作った
    Perl insert package
    package宣言をファイルパスから自動で入力

    View Slide

  32. PerlのVSCode拡張機能作った
    Perl insert package
    workspace内のファイルからpackage名を補完

    View Slide

  33. 本日のトピックでした
    おもしろいなと思ったものたちをご紹介してきました
    変数宣言
    コンテキストとハッシュ
    関数と引数
    リファレンスとオブジェクト指向
    CPANと名前空間
    DESTROYメソッド
    VSCodeとPerl

    View Slide

  34. Perlに興味が出たら
    次のトークは
    「40分で学ぶPerl入門 / 木本裕紀」
    Perlへの興味を持ったままシームレスに入門できてお得

    View Slide

  35. perldoc (日本語訳)
    my
    wantarray
    scalar
    perldata
    perlsub
    perlobj
    bless
    use
    require
    perlref
    参考資料
    CPAN
    Scope::Guard
    Try::Tiny

    View Slide