YAPC::Nagoya::Tiny 2019
他言語ユーザから見たPerlのおもしろさYAPC::Nagoya::Tiny 2019うたがわきき ([email protected])
View Slide
うたがわきき (@utgwkk)京都から来ましたKMC (京大マイコンクラブ)はてなサマーインターン2019はてなアルバイトエンジニア
「他言語ユーザから見た」もともとPython3をよく書いていたインターン・アルバイトでPerlを書きはじめたいち他言語ユーザがPerl (それをとりまくものたち) のどんなところが面白いと思ったのかご紹介
プログラミング言語界PerlRubyPythonGo JavaScriptJavaC#Scala Common LispRustC++Haskell
プログラミング言語を構成するもの文法・意味言語処理系ドキュメントライブラリ依存管理ツールコミュニティパッケージデータベース論文などなど
比べることでより見えてくるもの思想歴史的経緯イケてる点イケてない点特化した分野コミュニティの空気感おもしろさ
本日のトピックおもしろいなと思ったものたちをご紹介変数宣言コンテキストとハッシュ関数と引数リファレンスとオブジェクト指向CPANと名前空間DESTROYメソッドVSCodeとPerl
変数宣言my は組み込み関数変数のスコープを定めるuse strictしてたらmyなどを通さないと静的にエラー静的検査!!!my $x;
コンテキストmy @arr = (20, 30);my $x;$x = @arr; # $x == 2$x = scalar @arr; # $x == 2($x) = @arr; # $x == 20wantarrayコンテキストによって評価結果が変わる
ハッシュmy %hash = (foo => 10,bar => 20,);$hash{foo}; # => 10ハッシュテーブルとか辞書とか確かにそれっぽい
ハッシュ?my %hash = (foo => 10,bar => 20,);my (@a) = %hash;@a; # => ('foo', 10, 'bar', 20)ン?!
ハッシュ??my @arr = ('foo', 10, 'bar', 20);my %hash = @arr;$hash{foo}; # => 10ハハーン…
関数定義sub func {# do something ...}引数は??
引数受け取り方いろいろshift$_[0], $_[1]my ($a, $b) = @_my ($arg, %opts) = @_args my $a => 'Str'関数の引数情報を静的解析するの難しそう
リファレンスその前に2行2列の行列❌これは正しくない!!リストは入れ子にできない平坦化されるmy @matrix = ((1, 2),(3, 4),); # @matrix == (1,2,3,4)$matrix[1][1] # => undef
リファレンスmy $matrix = [[1, 2],[3, 4],];$matrix->[1]->[1] # => 42行2列の行列⭕これは正しい
リファレンスハッシュリファレンスmy $hashref = {foo => 10,bar => 20,};$hashref->{foo}; # => 10
そういえばPythonでもmatrix = [[1, 2],[3, 4],]matrix[1][1] # => 4dic = {'foo': 1,'bar': 2,}dic['foo'] # => 1どちらも参照でしたね
オブジェクト指向道具は(ほぼ)揃ったのでオブジェクト指向やるぞ!!
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
Perlのオブジェクト指向package宣言がそのままクラス名ぽい感じにハッシュリファレンスをblessでインスタンス作成コンストラクタ名はnewじゃなくてもよいuse (require) が成功したら真を返す必要がある$obj->foo でメソッド呼び出し手作り感ある
CPANと名前空間名前空間文化よさそうTest→テストに使うやつ とすぐわかるPythonでは名前からぱっと分かるとは限らないみんなが好きに名前を付けるAcmeモジュール文化おもしろい名前空間が分かれてるのでどんどん遊べる
Try::Tinyuse Try::Tiny;my $filename = 'notfound';try {open my $out, $filenameor die "Cannot open $filename";} catch {print STDERR "!!!!!!ERROR!!!!!!!\n";print STDERR $_;}モダンな例外処理ぽいtry,catchっていう関数にブロック渡してる
Scope::Guarduse Scope::Guard;open my $in, '/tmp/hoge';my $guard = guard { close $in };# do something ...用が済んだら close $in が呼ばれる
これってあれですよねimport "os"func main() {file, err := os.Open("/tmp/hoge")if err != nil {panic(err)}defer file.Close()// do something ...}
これってあれですよねwith open('/tmp/hoge') as f:content = f.read()withを抜けるとf.close()が呼ばれるcloseし忘れを防ぐ
Scope::Guarduse Scope::Guard;open my $in, '/tmp/hoge';my $guard = guard { close $in };# do something ...$guard は何?
sub DESTROYいわゆるデストラクタオブジェクトが回収されると呼ばれるデストラクタで設定を戻せば確かに忘れない新しい言語機能として実装せずにGCのついでによしなに処理が行われる空気感
Perl with VSCode業務ではVSCodeでPerlを書いている拡張機能あるけどそんなに多くない"perl" 42個 (marketplaceでの検索結果)参考:"ruby" 120個"python" 211個"javascript" 1386個
最近の悩みVSCodeでPerlを書いているpackage宣言を毎回書かないといけないlib/Foo/Bar/Baz.pm → package Foo::Bar::Baz法則あるので自動化できない?
PerlのVSCode拡張機能作ったPerl insert packagepackage宣言をファイルパスから自動で入力
PerlのVSCode拡張機能作ったPerl insert packageworkspace内のファイルからpackage名を補完
本日のトピックでしたおもしろいなと思ったものたちをご紹介してきました変数宣言コンテキストとハッシュ関数と引数リファレンスとオブジェクト指向CPANと名前空間DESTROYメソッドVSCodeとPerl
Perlに興味が出たら次のトークは「40分で学ぶPerl入門 / 木本裕紀」Perlへの興味を持ったままシームレスに入門できてお得
perldoc (日本語訳)mywantarrayscalarperldataperlsubperlobjblessuserequireperlref参考資料CPANScope::GuardTry::Tiny