Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019
Search
utagawa kiki
November 03, 2019
Programming
1
8.3k
他言語ユーザから見たPerlのおもしろさ / YAPC::Nagoya::Tiny 2019
YAPC::Nagoya::Tiny 2019
utagawa kiki
November 03, 2019
Tweet
Share
More Decks by utagawa kiki
See All by utagawa kiki
tparseでgo testの出力を見やすくする
utgwkk
2
270
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
4
790
自動で //nolint を挿入する取り組み / Gopher's Gathering
utgwkk
1
1.5k
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
2.9k
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
21
16k
Dive into gomock / Go Conference 2024
utgwkk
14
8.2k
Goでリフレクションする、その前に / Kansai.go #1
utgwkk
4
3.6k
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
7
4.2k
ありがとう、create-react-app
utgwkk
4
12k
Other Decks in Programming
See All in Programming
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.4k
Flutter On-device AI로 완성하는 오프라인 앱, 박제창 @DevFest INCHEON 2025
itsmedreamwalker
1
140
新卒エンジニアのプルリクエスト with AI駆動
fukunaga2025
0
230
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
110
ゲームの物理 剛体編
fadis
0
370
AIエンジニアリングのご紹介 / Introduction to AI Engineering
rkaga
8
3.3k
チームをチームにするEM
hitode909
0
370
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
0
160
モデル駆動設計をやってみようワークショップ開催報告(Modeling Forum2025) / model driven design workshop report
haru860
0
280
俺流レスポンシブコーディング 2025
tak_dcxi
14
9.5k
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
120
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.3k
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
43
Measuring & Analyzing Core Web Vitals
bluesmoon
9
710
Chasing Engaging Ingredients in Design
codingconduct
0
84
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Google's AI Overviews - The New Search
badams
0
870
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
0
94
A better future with KSS
kneath
240
18k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
37
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Reality Check: Gamification 10 Years Later
codingconduct
0
1.9k
KATA
mclloyd
PRO
33
15k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.4k
Transcript
他言語ユーザから見た Perlのおもしろさ YAPC::Nagoya::Tiny 2019 うたがわきき (
[email protected]
)
うたがわきき (@utgwkk) 京都から来ました KMC (京大マイコンクラブ) はてなサマーインターン2019 はてなアルバイトエンジニア
「他言語ユーザから見た」 もともとPython3をよく書いていた インターン・アルバイトでPerlを書きはじめた いち他言語ユーザがPerl (それをとりまくものたち) の どんなところが面白いと思ったのかご紹介
プログラミング言語界 Perl Ruby Python Go JavaScript Java C# Scala Common
Lisp Rust C++ 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 == 20 wantarray コンテキストによって評価結果が変わる
ハッシュ 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] # => 4 2行2列の行列 ⭕これは正しい
リファレンス ハッシュリファレンス my $hashref = { foo => 10, bar
=> 20, }; $hashref->{foo}; # => 10
そういえばPythonでも matrix = [ [1, 2], [3, 4], ] matrix[1][1]
# => 4 dic = { '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::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っていう関数に ブロック渡してる
Scope::Guard use 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::Guard use 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 package package宣言をファイルパスから自動で入力
PerlのVSCode拡張機能作った Perl insert package workspace内のファイルからpackage名を補完
本日のトピックでした おもしろいなと思ったものたちをご紹介してきました 変数宣言 コンテキストとハッシュ 関数と引数 リファレンスとオブジェクト指向 CPANと名前空間 DESTROYメソッド VSCodeとPerl
Perlに興味が出たら 次のトークは 「40分で学ぶPerl入門 / 木本裕紀」 Perlへの興味を持ったままシームレスに入門できてお得
perldoc (日本語訳) my wantarray scalar perldata perlsub perlobj bless use
require perlref 参考資料 CPAN Scope::Guard Try::Tiny