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
4k
はてなリモートインターンシップ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.1k
はてなインターンシップ2024 RDBMS ブートキャンプ講義資料
hatena
0
860
はてなインターンシップ2024 フロントエンドブートキャンプ講義資料
hatena
0
790
はてなインターンシップ2024 コンテナ講義資料
hatena
0
870
はてなインターンシップ2024 コンテナオーケストレーション講義資料
hatena
0
780
はてなインターンシップ2024 インフラ講義資料
hatena
0
800
はてなインターンシップ2024 AI 講義資料
hatena
0
790
はてなインターンシップ2024 ブログライティング講義資料
hatena
4
2.9k
はてなリモートインターンシップ2023 Web, HTTP 講義資料
hatena
1
490
Other Decks in Programming
See All in Programming
わたしの星のままで一番星になる ~ 出産を機にSIerからEC事業会社に転職した話 ~
kimura_m_29
0
180
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
140
103 Early Hints
sugi_0000
1
230
なまけものオバケたち -PHP 8.4 に入った新機能の紹介-
tanakahisateru
1
120
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
340
Recoilを剥がしている話
kirik
5
6.8k
rails statsで大解剖 🔍 “B/43流” のRailsの育て方を歴史とともに振り返ります
shoheimitani
2
940
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
390
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
380
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
550
testcontainers のススメ
sgash708
1
120
Featured
See All Featured
Side Projects
sachag
452
42k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.3k
Building an army of robots
kneath
302
44k
Why Our Code Smells
bkeepers
PRO
335
57k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Raft: Consensus for Rubyists
vanstee
137
6.7k
The World Runs on Bad Software
bkeepers
PRO
65
11k
Agile that works and the tools we love
rasmusluckow
328
21k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
127
18k
The Cult of Friendly URLs
andyhume
78
6.1k
Optimising Largest Contentful Paint
csswizardry
33
3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
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)*)+