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.6k
はてなリモートインターンシップ2023 Perlブートキャンプ講義資料
https://hatena.co.jp/recruit/intern/2023
Hatena
October 18, 2023
Tweet
Share
More Decks by Hatena
See All by Hatena
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
hatena
0
550
はてなインターンシップ2024 HTTP, Web, API 講義資料
hatena
0
1.5k
はてなインターンシップ2024 RDBMS ブートキャンプ講義資料
hatena
0
1.2k
はてなインターンシップ2024 フロントエンドブートキャンプ講義資料
hatena
0
1.1k
はてなインターンシップ2024 コンテナ講義資料
hatena
0
1.3k
はてなインターンシップ2024 コンテナオーケストレーション講義資料
hatena
0
1.1k
はてなインターンシップ2024 インフラ講義資料
hatena
0
1.1k
はてなインターンシップ2024 AI 講義資料
hatena
0
1.2k
はてなインターンシップ2024 ブログライティング講義資料
hatena
5
3.8k
Other Decks in Programming
See All in Programming
私の後悔をAWS DMSで解決した話
hiramax
4
210
アプリの "かわいい" を支えるアニメーションツールRiveについて
uetyo
0
280
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
190
Updates on MLS on Ruby (and maybe more)
sylph01
1
180
Ruby×iOSアプリ開発 ~共に歩んだエコシステムの物語~
temoki
0
350
Navigating Dependency Injection with Metro
zacsweers
3
3.5k
「待たせ上手」なスケルトンスクリーン、 そのUXの裏側
teamlab
PRO
0
570
スケールする組織の実現に向けた インナーソース育成術 - ISGT2025
teamlab
PRO
2
170
Kiroで始めるAI-DLC
kaonash
2
630
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
260
AIでLINEスタンプを作ってみた
eycjur
1
230
AIを活用し、今後に備えるための技術知識 / Basic Knowledge to Utilize AI
kishida
22
5.9k
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
It's Worth the Effort
3n
187
28k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
30
9.7k
The Cult of Friendly URLs
andyhume
79
6.6k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.6k
A Modern Web Designer's Workflow
chriscoyier
696
190k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Docker and Python
trallard
46
3.6k
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)*)+