Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
はてなリモートインターンシップ2023 Perlブートキャンプ講義資料
Search
Hatena
October 18, 2023
Programming
0
4.1k
はてなリモートインターンシップ2023 Perlブートキャンプ講義資料
https://hatena.co.jp/recruit/intern/2023
Hatena
October 18, 2023
Tweet
Share
More Decks by Hatena
See All by Hatena
はてなインターンシップ2024 HTTP, Web, API 講義資料
hatena
0
1.2k
はてなインターンシップ2024 RDBMS ブートキャンプ講義資料
hatena
0
960
はてなインターンシップ2024 フロントエンドブートキャンプ講義資料
hatena
0
880
はてなインターンシップ2024 コンテナ講義資料
hatena
0
1k
はてなインターンシップ2024 コンテナオーケストレーション講義資料
hatena
0
870
はてなインターンシップ2024 インフラ講義資料
hatena
0
890
はてなインターンシップ2024 AI 講義資料
hatena
0
880
はてなインターンシップ2024 ブログライティング講義資料
hatena
4
3.2k
トップダウン・ボトムアップの両面から作るチーム内マトリクス組織
hatena
0
9
Other Decks in Programming
See All in Programming
Amazon Q Developer Proで効率化するAPI開発入門
seike460
PRO
0
110
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
790
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
130
SwiftUIで単方向アーキテクチャを導入して得られた成果
takuyaosawa
0
270
CI改善もDatadogとともに
taumu
0
120
SpringBoot3.4の構造化ログ #kanjava
irof
2
1k
Open source software: how to live long and go far
gaelvaroquaux
0
630
Honoとフロントエンドの 型安全性について
yodaka
7
1.2k
Conform を推す - Advocating for Conform
mizoguchicoji
3
690
Domain-Driven Transformation
hschwentner
2
1.9k
sappoRo.R #12 初心者セッション
kosugitti
0
250
責務と認知負荷を整える! 抽象レベルを意識した関心の分離
yahiru
3
550
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
A designer walks into a library…
pauljervisheath
205
24k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
Designing for Performance
lara
604
68k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
How STYLIGHT went responsive
nonsquared
98
5.4k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
A better future with KSS
kneath
238
17k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
630
Transcript
Hatena Remote Internship 0102 Perlブートキャンプ #hatenaintern)*)+
Perl読んだこと/書いたことありま すか? #hatenaintern)*)+
Perl? #hatenaintern)*)+
Perl? Perl(パール)とは、ラリー‧ウォールによって開発されたプロ グラミング⾔語である。 実⽤性と多様性を重視しており、C⾔語 やsed、awk、シェルスクリプトなど他のプログラミング⾔語の優 れた機能を取り⼊れている。 ウェブ‧アプリケーション、システ ム管理、テキスト処理などのプログラムを書くのに広く⽤いられ ている。 #hatenaintern)*)+
Perl? • Go と違って、コンパイルをしないインタプリタ型⾔語 • Better shell としても使えるし、ウェブアプリケーションを書くこ とだってできる •
素早いウェブ開発の道具として、古くから⼈気の Lightweight Language • はてな/DeNA/mixi/LINE... • みなさんが配属される予定のチームでも #hatenaintern)*)+
Perl? • Perl == Perl( • 偶数が安定版、奇数が開発版 • Perl3がリリースされた時期もあった •
今はRakuという別⾔語になっている • Perl(とPerl3(Raku)はJavaと JavaScriptくらいの差がある #hatenaintern)*)+
Perl? • はてなでは今も元気に使っている • HTMLのテンプレートエンジンとして(Xslate) • GraphQLサーバーとして • 他にもUNIXではよく使われている •
git • Linux • LaTeX #hatenaintern)*)+
ゴール 1時間強で「Perl完全に理解した」になる #hatenaintern)*)+
ゴール のはもちろん難しいので... • 既存のコードを読むための取っ掛かりが作れるようになる • 困ったときのインデックスとして • 周りのコードを参考にしながらPerlが書けるようになる #hatenaintern)*)+
Perlに触れていく前に... #hatenaintern)*)+
ドキュメントはperldocで引く % perldoc Carton # Ϟδϡʔϧʢޙड़ʣͷυΩϡϝϯτ % perldoc -f print
# ΈࠐΈؔ -f % perldoc -v @_ # ΈࠐΈม -v % perldoc perl #hatenaintern)*)+
CPAN • The Comprehensive Perl Archive Network • https://metacpan.org •
世界中のさまざまなPerlモジュールが集まっている • Perlの⾔語的な強みの⼀つ=コミュニティ #hatenaintern)*)+
Carton • Ruby でいう Bundler みたいなもの • cpanfile に書いた モジュール名@バージョン
を、ローカルのデ ィレクトリ local/ にインストールしてくれる • チームでは Docker 使うのであまり問題にはならないかも • 現代ではCartonの後継としてCarmelも開発されている #hatenaintern)*)+
Perlとコミュニティ • ⽇本でPerlが流⾏った理由の1つにコミュニティがある • ͳΜͱ͔.pm(PerlMongers)みたいな名前 • 今流⾏りに流⾏っているクリスマスにブログを書くアドベント カレンダーを始めたのもPerlコミュニティ • https://twitter.com/klm/status/mpppqrpqlssqtslullr
• https://perl-users.jp/articles/advent-calendar/zuur/ #hatenaintern)*)+
Perlとコミュニティ • カンファレンスとしてはYAPCが有名 • 草の根的なカンファレンス • 2015年まではYAPC::Asiaとして、2016年からはYAPC::Japanとし てリブート • PerlのカンファレンスなのにPerlの話が多いとびっくりされる
• 2023年3⽉に京都で開催(過去には北海道、⼤阪、福岡、沖縄、東京 でも) #hatenaintern)*)+
Perlという⾔語 #hatenaintern)*)+
• モジュール • 拡張⼦は.pm package Example::Greeter; use strict; use warnings;
sub greet { my ($class, $what) = @_; print "hello, $what\n"; } 1; #hatenaintern)*)+
• メインスクリプト • 拡張⼦は.pl • Prologも同じ拡張⼦ use strict; use warnings;
use lib 'lib'; use Example::Greeter; Example::Greeter->greet('world'); • 実⾏ % perl -Ilib main.pl hello, world #hatenaintern)*)+
おまじない • use strict; use warnings; • 素のPerlはかなり⾃由 • もともとawk/sedの影響が強いので同じようなことができる
• use strict; すると my で宣⾔していない変数があると静的にエラー • use warnings; すると警告が有効になる • 詳しくは perldoc strict / perldoc warnings #hatenaintern)*)+
変数 • Perl の変数は、そのデータ型に応じてシジルと呼ばれる記号が 先頭につく • my $hoge のようにして変数宣⾔する •
静的な型はない • $ @ % #hatenaintern)*)+
$: スカラ • 1つの値 • 数字も⽂字列もすべてスカラ my $scalar1 = 'test';
my $scalar2 = 1000; my $scalar3 = \@array; # ϦϑΝϨϯεʢޙड़ʣ • 0や""(空⽂字列)は falsy な値として扱われる • "0" もfalsy #hatenaintern)*)+
undef • スカラ変数の初期値 • いわゆる undefined とか nil とか •
defined 組み込み関数で undef かどうかチェックできる my $x; print $x; # "Use of uninitialized value $x in print" #hatenaintern)*)+
@: 配列 my @array = ('a', 'b', 'c'); #hatenaintern)*)+
配列へのアクセス print $array[1]; # => b • 配列のいち要素はスカラなので、アクセスする場合は $array[1] になる
• $array と @array は別物 #hatenaintern)*)+
配列の操作 $array[0]; # get $array[1] = 'hoge'; # set push
@array, 'meow'; # ࠷ޙʹཁૉΛՃ my $v = shift @array; # ࠷ॳͷཁૉΛऔΓআ͍ͯฦ͢ my $length = scalar @array; # ͞ for my $e (@array) { # શཁૉϧʔϓ print $e; } #hatenaintern)*)+
配列の操作 my @doubles = map { $_ * 2 }
@numbers; # ͯ͢Λ2ഒʹͨ͠ྻΛ࡞Δ my @over20 = grep { $_ > 20 } @numbers; # 20ΑΓେ͖ͳ͚ͩΛूΊͨྻΛ࡞Δ • $_ は特殊変数 • この場合では配列の各要素が順に取り出されて⼊ってくる #hatenaintern)*)+
%: ハッシュ • いわゆるディクショナリやマップ my %hash = ( perl =>
'larry', ruby => 'matz', ); • => は"fat comma"と呼ばれ、( perl => 'larry' ) は ( 'perl', 'larry' ) と同⼀ #hatenaintern)*)+
%: ハッシュ • 右辺は配列のときと同様なリストだが、どんな変数に格納する かでアクセスの仕⽅が変わる • コンテキスト #hatenaintern)*)+
Perlのデータ構造 • Perlのデータ構造を意味上で分類するとスカラとリストの2種類 • スカラ(単⼀)の値 • ⽂字列(hoge) • 数値 •
リファレンス(後述) • リスト • (1,2,3,'hoge', 'foo') • リストをどう使うかはシジル(@, %)で決定する #hatenaintern)*)+
リストのつかいかた • リストをどう使うかはシジル(@, %)で決定する • @array = (1,2,3) • こうすると配列
• %array = (1,2,3) • こうするとハッシュ • 1 => 2, 3 => undef #hatenaintern)*)+
リファレンス • とても重要 • リファレンス = スカラ/配列/ハッシュなどへの参照 • Perlの配列やハッシュはかなり素朴 •
複雑なデータ構造を作る場合に必ず必要になる #hatenaintern)*)+
リファレンス • ⼊れ⼦の⾏列を作ってみるか... my @matrix = ( (0, 1, 2,
3), (4, 5, 6, 7), ); • このコードは配列の合成になる • リストを⼊れ⼦にできない my @matrix = (0, 1, 2, 3, 4, 5, 6, 7); #hatenaintern)*)+
そこでリファレンス my @array = ('a', 'b', 'c'); my $ref =
\@array; # @array ͷϦϑΝϨϯε my $ref = ['a', 'b', 'c']; # ্هͷུهɻͪͳΈʹ \('a', 'b', 'c') ผ # 2ͭͷྻͷϦϑΝϨϯεΛͬͨʢ͞2ͷʣྻ my @matrix = ( [0, 1, 2, 3], [4, 5, 6, 7], ); #hatenaintern)*)+
配列リファレンスへのアクセス my @array2 = @$ref; # ಄ʹ @ Λ͚ͭͯྻʹ͢ʢσϦϑΝϨϯεʣ print
$ref->[1]; # -> ΛͬͯΞΫηε #hatenaintern)*)+
ハッシュリファレンス my %hash = ( perl => 'larry', ruby =>
'matz', ); my $ref = \%hash; # ུه my $ref = { perl => 'larry', ruby => 'matz', }; #hatenaintern)*)+
ハッシュリファレンスへのアクセス my $ref = { perl => 'larry', ruby =>
'matz', }; # % Λ಄ʹ͚ͭͯσϦϑΝϨϯε # keysΈࠐΈؔɻϋογϡͷΩʔͷҰཡΛऔಘ͢Δ my @keys = keys %$ref; print $ref->{perl}; # -> ͰΞΫηε #hatenaintern)*)+
デリファレンスいろいろ • なにかの式をデリファレンスするときは @{ ... } とか %{ ... }
で 囲む my $a_of_a = [ [1, 2, 3], [4, 5, 6], ]; my @array = @{ $a->[1] }; #hatenaintern)*)+
• Postfix dereference my @array = $a->[1]->@*; #hatenaintern)*)+
正規表現 • Perlの強みのひとつ。めちゃ強⼒ • /.../ で正規表現リテラルを⽣成、=~ で⽂字列にマッチさせる my ($id) =
("͜Μʹͪɺid:motemen Ͱ͢" =~ /id:(.+)/); # จࣈྻϚονͰҰ෦Λൈ͖ग़͢ my @lines = split /\n/, $text; # ೖྗΛߦʹׂ • perldoc perlre #hatenaintern)*)+
そのほか • if ⽂とかは想像通りのものがだいたいある • else if はなくて elsif •
ループの制御構⽂ • continueは next, breakは last • ⽂字列の⽐較は == などではなく eq • 数値の場合は==なので気をつけよう • perldoc perlop #hatenaintern)*)+
そのほか • ⽂字列の結合は .(ドット)等 $hoge = 'abc' . 'def' #
abcdef • qw(foo bar baz) は ('foo', 'bar', 'baz') の糖⾐構⽂ • perldoc -f qw #hatenaintern)*)+
そのほか • リストの全体を加⼯するときはmapなどを使う • 全体を[]でくくると配列 • 全体を{}でくくるとハッシュ my $double_array =
[ map { $_ * 2} (1,2,3) ]; # [2, 4, 6] my $hash = { map { $_ => 1} (qw(foo bar baz)) }; # { foo => 1, bar => 1, baz => 1} #hatenaintern)*)+
コンテキスト • Perlの難しいところのひとつ • 式を評価する際に考慮する必要がある • スカラコンテキストとリストコンテキストがある my @array =
(10, 20, 30); my @x = @array; # ͜ͷ @array ϦετίϯςΩετͰධՁ͞ΕΔ my $y = @array; # ͜ͷ @array εΧϥίϯςΩετͰධՁ͞ΕΔ my ($z) = @array; # ͜ͷ @array ϦετίϯςΩετͰධՁ͞ΕΔ #hatenaintern)*)+
コンテキスト • @x が (10, 20, 30) になるのはまあ⾃然 • では
$y は...? • $y == 3 • 配列をスカラコンテキストで評価するとその⻑さを返す • $zには配列の先頭要素が代⼊され($z == 10)配列の残りは 捨てられる #hatenaintern)*)+
コンテキストのよくある罠 なんかユーザから送られた⼊⼒を受けとり、リストコンテキスト では配列を返す関数 param() があったとして my $in = { name
=> param('key') # ͜ͷؔݺͼग़͠ϦετίϯςΩετͰධՁ͞ΕΔ }; #hatenaintern)*)+
コンテキストのよくある罠 my $in = { name => ('foo', 'bar', 'baz')
}; my $in = { name => 'foo', bar => 'baz', }; という感じになり、なぜかbarという不思議なキーが⽣え、不可解 なバグの原因となりうる #hatenaintern)*)+
コンテキストクイズ sort <͜͜>; length <͜͜>; if (<͜͜>) { } for
my $i (<͜͜>) { } $obj->method(<͜͜>); my $x = <͜͜>; my ($x) = <͜͜>; my @y = <͜͜>; my %hash = ( key0 => 'hoge', key1 => <͜͜>, ); scalar(<͜͜>); <͜͜>; #hatenaintern)*)+
コンテキストクイズ(解答) sort <Ϧετ>; length <Ϧετ>; if (<εΧϥ>) { } for
my $i (<Ϧετ>) { } $obj->method(<Ϧετ>); my $x = <εΧϥ> my ($x) = <Ϧετ>; my @y = <Ϧετ>; my %hash = ( key0 => 'hoge', key1 => <εΧϥ>, ); scalar(<Ϧετ>); <εΧϥ>; #hatenaintern)*)+
関数(サブルーチン) sub foo { my ($a, $b, $c) = @_;
} のように宣⾔して foo(1, 2, 3); で呼び出す。引数なしの関数呼び出しはカッコ省略できる #hatenaintern)*)+
引数の受け取り⽅ sub add { my ($x, $y) = @_; return
$x + $y; } my $three = add(1, 2); • add(1,2) と呼び出したときの引数は @_ という特殊な配列に格納さ れる • これが($x, $y)に分割代⼊される #hatenaintern)*)+
引数の受け取り⽅ • shiftを使う • 引数なしのshiftは暗黙的に@_を引数に取る • my $arg1 = shift;とすると@_の先頭要素が$arg1に代⼊され
る • @_は配列なので... • my $arg1 = $_[0]で最初の引数にアクセスすることもできる #hatenaintern)*)+
引数処理イディオム sub func1 { my ($arg1, $arg2, %args) = @_;
my $opt1 = $args{opt1}; my $opt2 = $args{opt2}; } func1('hoge', 'fuga', opt1 => 1, opt2 => 2); 最後に%argsと受けることで(省略可能な)名前付き引数を実現で きる #hatenaintern)*)+
値の返し⽅ • return で返せるが、省略可能 • 省略した場合は最後に評価された式の結果が返り値となる • 意図がわかりづらくなるので書きましょう #hatenaintern)*)+
モジュールシステム • パッケージ package Example::Greeter; と書くと、以降のソースコードはExample::Greeterという名前空 間に属する パッケージとは関数の名前が所属する先、と考えると良い #hatenaintern)*)+
モジュールシステム • パッケージ package A; sub foo { ... }
package B; sub bar { ... } それぞれ A::foo() / B::bar() で関数を参照できる #hatenaintern)*)+
モジュールシステム概要 • use Foo::Bar::Baz • lib/Foo/Bar/Baz.pmが読み込まれ、Foo::Bar::Baz名前空間が 作られる • Perlの実⾏ファイルは .pl
モジュールは .pm 拡張⼦ • 実務で書くのはほとんど .pm #hatenaintern)*)+
モジュールシステム概要 • useしたときのファイルの探索先は@INCというグローバルな特 殊変数に格納されている • 慣習的に、プロジェクト直下の./libを@INCに⼊れるよう構成 されている • @INCを直接操作したり、perl -Ilibで起動する
• perldoc -f use / perldoc -v @INC #hatenaintern)*)+
典型的なモジュール package Foo::Bar::Baz; use strict; use warnings; # ͜ͷύοέʔδͷ֎͔Β Foo::Bar::Baz::public_function
ͰΞΫηεͰ͖Δͧ sub public_function { ... } # ඇެ։ͳؾͷϝιου _ Ͱ͡ΊΔͧɻؾ͚ͩͳͷͰ֎͔ΒΞΫηεͰ͖ͪΌ͏͕ɻ sub _private_function { ... } # Ϟδϡʔϧͷ࠷ޙʹ͔ͳΒͣਅΛه͢ɻͦ͏͠ͳ͍ͱ use ͕ࣦഊ͢Δͧɻ 1; #hatenaintern)*)+
解説 • use MODULE 'foo', 'bar'...; でモジュールに⽣えている関数をイ ンポートできる • 本当はもう少し汎⽤的で複雑だが、この理解で困らない
• useの引数なしでも勝⼿にインポートしてくれるモジュールも ある • Data::Dumper / JSON など #hatenaintern)*)+
オブジェクト指向 • Perlはもともとオブジェクト指向⾔語として始まったわけでは ないので後付け • が、普通に使える • パッケージとリファレンスがわかっていれば、ほぼカバーでき る #hatenaintern)*)+
ここでオブジェクト指向について考 えよう #hatenaintern)*)+
オブジェクト指向とは? • すごく簡単に⾔えばデータ構造と⼿続きを⼀緒にしたもの • オブジェクトはクラスから⽣成される • オブジェクトはデータを持つ • クラスにはデータに対する⼿続き(メソッド)が定義されて いる
#hatenaintern)*)+
PerlにおけるOOP OOPにおける⽤語 Perlでの⽤語 クラス パッケージ メソッド パッケージに定義された関数 オブジェクト パッケージにbless()されたリフ ァレンス
#hatenaintern)*)+
bless • blessがオブジェクト指向Perlにおける最後の登場⼈物 # ͳΜ͔σʔλ͕͋Δʢී௨ϋογϡϦϑΝϨϯεʣ my $data = { name
=> 'motemen' }; # σʔλʹύοέʔδΛඥ͚Δͱ my $self = bless $data, 'Hatena::Engineer'; # ϝιου͕ݺΔʂ ͜͜Ͱ Hatena::Engineer::tweet $self->tweet(); #hatenaintern)*)+
͍͍͔ɺΈΜͳ ɹɹɹɹɹɹɹɹ ƅшƅ ) ɹɹɹɹɹɹɹɹ(|ɹy |) ϋογϡϦϑΝϨϯεͱ package Ͱखଓ͖ܕϓϩάϥϛϯά͔͠Ͱ͖ͳ͍͕ ɹɹɹɹɹ
{}ɹ (ƅшƅ)ɹpackage ɹɹɹɹɹɹɹʘʗ|ɹy |ʘʗ ɹɹɹɹೋͭ߹Θ͞ΕOOPͱͳΔ ɹɹɹɹɹɹɹɹ(ƅшƅ)ɹ bless ɹɹɹɹɹɹɹɹ(ʘʗʘʗ #hatenaintern)*)+
コンストラクタ • コンストラクタも⾃分で書く。普通はnewという名前を使う • が、そういう制約があるわけではない。違う名前のコンスト ラクタを作ることもできる #hatenaintern)*)+
コンストラクタ package Person; use strict; use warnings; sub new {
my ($class, %args) = @_; return bless \%args, $class; } #hatenaintern)*)+
使い⽅ my $person = Person->new(age => 18); # { age
=> 18 } ͕ Person ʹ bless ͞Εͨͷ #hatenaintern)*)+
使い⽅ • Person->new(age => 01) は Person::new('Person', age => 01)
の 糖⾐構⽂ • こうやってクラスメソッドを定義する • blessされていてもハッシュリファレンスであることに変わりはない • $person->{age} で中⾝にアクセスすることも可能 • できるけどオブジェクトを使うところではやらない #hatenaintern)*)+
メソッド package Person; use strict; use warnings; sub new {
my ($class, %args) = @_; return bless \%args, $class; } sub age { my ($self) = @_; return $self->{age}; } sub incr_age { my ($self) = @_; $self->{age}++; } #hatenaintern)*)+
メソッド $person->incr_age; • $person->incrage_ は $person のbless先である Person をた どって、結局
Person::incr_age($person) と同様 • こうやってインスタンスメソッドが定義できる #hatenaintern)*)+
メソッド呼び出しまとめ # ͜ͷೋ͕ͭՁ Class->method($arg1, $arg2); Class::method('Class', $arg1, $arg2); # ͜ͷೋ͕ͭՁ
$object->method($arg1, $arg2); Class::method($object, $arg1, $arg2); #hatenaintern)*)+
継承 package Animal; use strict; use warnings; sub new {
... } sub walk { ... } 1; package Dog; use strict; use warnings; use parent 'Animal'; 1; #hatenaintern)*)+
継承 my $dog = Dog->new(); $dog->walk(); # Animal::walk ͕ݺΕΔ •
仕組みとしては可能だけどあまり最近は使われていない • Perl⾃体がIDEのサポートを受けづらい(無いわけではない) • 複雑になる #hatenaintern)*)+
オブジェクト指向まとめ • ⼿作り感あふれるオブジェクト指向 • パッケージに⼿続きを定義 • bless でデータと結びつける • コンストラクタは⾃分でつくる、オブジェクトも⾃分で作る
• オブジェクト指向⾵に呼び出せるような糖⾐ #hatenaintern)*)+
便利なCPANモジュール package Foo; use strict; use warnings; use Class::Accessor::Lite (
new => 1, ro => ['bar'], ); 1; my $foo = Foo->new(bar => 1); # new Ͱ͖ͯΔ $fop->bar; # bar ϝιουੜ͑ͯΔ #hatenaintern)*)+
便利なCPANモジュール • ORM • Teng • Aniki • リスト操作系 •
List::Util • List::MoreUtils #hatenaintern)*)+
便利なCPANモジュール • ͳΜͱ͔::XS • C⾔語のPerl拡張のXS⾔語で書かれてるので⼀般的に早い • それ以外だとなんとか::Liteとかなんとか::Fastみたいなのが早 い(とされる) • モジュールを探すときはmetacpanから探そう
• https://metacpan.org/ #hatenaintern)*)+
便利なCPANモジュール なんとか::Liteとかの⾼速なモジュールはだいたい⽇本のコミュニ ティから作られている "why does it need to be so
fast?" "because we are japanese !!!!" https://uzulla.hateblo.jp/entry/<=>?/=@/></=A=B<@ #hatenaintern)*)+
おまけ (現代のPerl) • Perlの最新version /.12からはclass機能が実験的に利⽤可能に • 今開発が熱いぞ!!! #hatenaintern)*)+
おまけ (現代のPerl) use v5.38; use feature 'class'; no warnings 'experimental::class';
class My::Example { field $x; ADJUST { $x = "Hello, world"; } method print_message { say $x; } } My::Example->new->print_message; #hatenaintern)*)+
テスト テストを書くエコシステムもきちんと整っている • proveというテスト実⾏⽤のコマンドが同梱されている • テストはt/ディレクトリ以下に置く • 拡張⼦は.t(中⾝はPerlスクリプト) #hatenaintern)*)+
テスト Testなんとかみたいなモジュールを使ってテストする。 社内(外)でよく使われているテストモジュール • Test&::V) • モダンなテストモジュール • Test::More •
昔からよく使われているテストモジュール • Test::Class • ユニットテストを書きやすくするモジュール #hatenaintern)*)+
テスト use strict; use warnings; use Test::More; use Person; my
$person = Person->new(age => 18); is $person->age, 18, '࠷ॳ18ࡀ'; $person->incr_age; is $person->age, 19, 'incr_age ݺΜͩΒ19ࡀ'; done_testing; #hatenaintern)*)+
テスト % prove -Ilib -v t/Person.t t/Person.t .. ok 1
- ࠷ॳ18ࡀ ok 2 - incr_age ݺΜͩΒ19ࡀ 1..2 ok All tests successful. Files=1, Tests=2, 0 wallclock secs ( 0.01 usr 0.01 sys + 0.04 cusr 0.00 csys = 0.06 CPU) Result: PASS #hatenaintern)*)+
Test::Class package t::Person; use strict; use warnings; use parent 'Test::Class';
sub setup : Test(setup) { # ͳʹ͔ෆࢥٞͳຐ๏Ͱ໊ؔͷ͋ͱʹΞϊʔςʔγϣϯͰ͖Δ # ֤ςετલͷηοτΞοϓʢมΛΫϦΞͨ͠Γͱ͔ʣ } sub incr_age : Tests { is ...; } #hatenaintern)*)+
ということで • 駆け⾜だけどPerlの基礎からオブジェクト指向プログラミングの 話までしました • PerlにおけるWebアプリの話もできると良かったけど(時間的 に)今回はここまで • 来週からいよいよチームに⼊っていくことになります。周りのは てな社員をどんどん頼ってください!!
• みんな優しく教えてくれると思います #hatenaintern)*)+