Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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っていう関数に ブロック渡してる

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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