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.7k
はてなリモートインターンシップ2023 Perlブートキャンプ講義資料
https://hatena.co.jp/recruit/intern/2023
Hatena
October 18, 2023
Tweet
Share
More Decks by Hatena
See All by Hatena
Perlブートキャンプ
hatena
0
1.6k
はてなサマーインターンシップ2025 Web API 講義資料
hatena
0
620
はてなサマーインターンシップ2025 フロントエンド 講義資料
hatena
18
8.8k
はてなサマーインターンシップ2025 コンテナ + Kubernetesハンズオン 講義資料
hatena
0
370
はてなサマーインターンシップ2025 クラウドと運用 講義資料
hatena
0
360
はてなサマーインターンシップ2025 RDBMSの基礎 講義資料
hatena
0
410
はてなサマーインターンシップ2025 セキュリティ 講義資料
hatena
0
410
はてなサマーインターンシップ2025 AIエージェント活用 講義資料
hatena
1
2k
はてなサマーインターンシップ2025 プロダクトマネジメント 講義資料
hatena
0
420
Other Decks in Programming
See All in Programming
モビリティSaaSにおけるデータ利活用の発展
nealle
1
660
Stay Hacker 〜九州で生まれ、Perlに出会い、コミュニティで育つ〜
pyama86
2
2.8k
モデル駆動設計をやってみよう Modeling Forum2025ワークショップ/Let’s Try Model-Driven Design
haru860
0
200
GeistFabrik and AI-augmented software development
adewale
PRO
0
200
Promise.tryで実現する新しいエラーハンドリング New error handling with Promise try
bicstone
3
1.7k
Web エンジニアが JavaScript で AI Agent を作る / JSConf JP 2025 sponsor session
izumin5210
4
2.1k
「文字列→日付」の落とし穴 〜Ruby Date.parseの意外な挙動〜
sg4k0
0
310
Why Kotlin? 電子カルテを Kotlin で開発する理由 / Why Kotlin? at Henry
agatan
1
130
オフライン対応!Flutterアプリに全文検索エンジンを実装する @FlutterKaigi2025
itsmedreamwalker
2
320
AIと協働し、イベントソーシングとアクターモデルで作る後悔しないアーキテクチャ Regret-Free Architecture with AI, Event Sourcing, and Actors
tomohisa
2
10k
Querying Design System デザインシステムの意思決定を支える構造検索
ikumatadokoro
1
1.2k
Duke on CRaC with Jakarta EE
ivargrimstad
0
280
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How GitHub (no longer) Works
holman
315
140k
Done Done
chrislema
186
16k
Fireside Chat
paigeccino
41
3.7k
Making Projects Easy
brettharned
120
6.5k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
GraphQLの誤解/rethinking-graphql
sonatard
73
11k
Side Projects
sachag
455
43k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
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)*)+