Slide 1

Slide 1 text

Hatena Remote Internship 0102 Perlブートキャンプ #hatenaintern)*)+

Slide 2

Slide 2 text

Perl読んだこと/書いたことありま すか? #hatenaintern)*)+

Slide 3

Slide 3 text

Perl? #hatenaintern)*)+

Slide 4

Slide 4 text

Perl? Perl(パール)とは、ラリー‧ウォールによって開発されたプロ グラミング⾔語である。 実⽤性と多様性を重視しており、C⾔語 やsed、awk、シェルスクリプトなど他のプログラミング⾔語の優 れた機能を取り⼊れている。 ウェブ‧アプリケーション、システ ム管理、テキスト処理などのプログラムを書くのに広く⽤いられ ている。 #hatenaintern)*)+

Slide 5

Slide 5 text

Perl? • Go と違って、コンパイルをしないインタプリタ型⾔語 • Better shell としても使えるし、ウェブアプリケーションを書くこ とだってできる • 素早いウェブ開発の道具として、古くから⼈気の Lightweight Language • はてな/DeNA/mixi/LINE... • みなさんが配属される予定のチームでも #hatenaintern)*)+

Slide 6

Slide 6 text

Perl? • Perl == Perl( • 偶数が安定版、奇数が開発版 • Perl3がリリースされた時期もあった • 今はRakuという別⾔語になっている • Perl(とPerl3(Raku)はJavaと JavaScriptくらいの差がある #hatenaintern)*)+

Slide 7

Slide 7 text

Perl? • はてなでは今も元気に使っている • HTMLのテンプレートエンジンとして(Xslate) • GraphQLサーバーとして • 他にもUNIXではよく使われている • git • Linux • LaTeX #hatenaintern)*)+

Slide 8

Slide 8 text

ゴール 1時間強で「Perl完全に理解した」になる #hatenaintern)*)+

Slide 9

Slide 9 text

ゴール のはもちろん難しいので... • 既存のコードを読むための取っ掛かりが作れるようになる • 困ったときのインデックスとして • 周りのコードを参考にしながらPerlが書けるようになる #hatenaintern)*)+

Slide 10

Slide 10 text

Perlに触れていく前に... #hatenaintern)*)+

Slide 11

Slide 11 text

ドキュメントはperldocで引く % perldoc Carton # Ϟδϡʔϧʢޙड़ʣͷυΩϡϝϯτ % perldoc -f print # ૊ΈࠐΈؔ਺͸ -f % perldoc -v @_ # ૊ΈࠐΈม਺͸ -v % perldoc perl #hatenaintern)*)+

Slide 12

Slide 12 text

CPAN • The Comprehensive Perl Archive Network • https://metacpan.org • 世界中のさまざまなPerlモジュールが集まっている • Perlの⾔語的な強みの⼀つ=コミュニティ #hatenaintern)*)+

Slide 13

Slide 13 text

Carton • Ruby でいう Bundler みたいなもの • cpanfile に書いた モジュール名@バージョン を、ローカルのデ ィレクトリ local/ にインストールしてくれる • チームでは Docker 使うのであまり問題にはならないかも • 現代ではCartonの後継としてCarmelも開発されている #hatenaintern)*)+

Slide 14

Slide 14 text

Perlとコミュニティ • ⽇本でPerlが流⾏った理由の1つにコミュニティがある • ͳΜͱ͔.pm(PerlMongers)みたいな名前 • 今流⾏りに流⾏っているクリスマスにブログを書くアドベント カレンダーを始めたのもPerlコミュニティ • https://twitter.com/klm/status/mpppqrpqlssqtslullr • https://perl-users.jp/articles/advent-calendar/zuur/ #hatenaintern)*)+

Slide 15

Slide 15 text

Perlとコミュニティ • カンファレンスとしてはYAPCが有名 • 草の根的なカンファレンス • 2015年まではYAPC::Asiaとして、2016年からはYAPC::Japanとし てリブート • PerlのカンファレンスなのにPerlの話が多いとびっくりされる • 2023年3⽉に京都で開催(過去には北海道、⼤阪、福岡、沖縄、東京 でも) #hatenaintern)*)+

Slide 16

Slide 16 text

Perlという⾔語 #hatenaintern)*)+

Slide 17

Slide 17 text

• モジュール • 拡張⼦は.pm package Example::Greeter; use strict; use warnings; sub greet { my ($class, $what) = @_; print "hello, $what\n"; } 1; #hatenaintern)*)+

Slide 18

Slide 18 text

• メインスクリプト • 拡張⼦は.pl • Prologも同じ拡張⼦ use strict; use warnings; use lib 'lib'; use Example::Greeter; Example::Greeter->greet('world'); • 実⾏ % perl -Ilib main.pl hello, world #hatenaintern)*)+

Slide 19

Slide 19 text

おまじない • use strict; use warnings; • 素のPerlはかなり⾃由 • もともとawk/sedの影響が強いので同じようなことができる • use strict; すると my で宣⾔していない変数があると静的にエラー • use warnings; すると警告が有効になる • 詳しくは perldoc strict / perldoc warnings #hatenaintern)*)+

Slide 20

Slide 20 text

変数 • Perl の変数は、そのデータ型に応じてシジルと呼ばれる記号が 先頭につく • my $hoge のようにして変数宣⾔する • 静的な型はない • $ @ % #hatenaintern)*)+

Slide 21

Slide 21 text

$: スカラ • 1つの値 • 数字も⽂字列もすべてスカラ my $scalar1 = 'test'; my $scalar2 = 1000; my $scalar3 = \@array; # ϦϑΝϨϯεʢޙड़ʣ • 0や""(空⽂字列)は falsy な値として扱われる • "0" もfalsy #hatenaintern)*)+

Slide 22

Slide 22 text

undef • スカラ変数の初期値 • いわゆる undefined とか nil とか • defined 組み込み関数で undef かどうかチェックできる my $x; print $x; # "Use of uninitialized value $x in print" #hatenaintern)*)+

Slide 23

Slide 23 text

@: 配列 my @array = ('a', 'b', 'c'); #hatenaintern)*)+

Slide 24

Slide 24 text

配列へのアクセス print $array[1]; # => b • 配列のいち要素はスカラなので、アクセスする場合は $array[1] になる • $array と @array は別物 #hatenaintern)*)+

Slide 25

Slide 25 text

配列の操作 $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)*)+

Slide 26

Slide 26 text

配列の操作 my @doubles = map { $_ * 2 } @numbers; # ͢΂ͯΛ2ഒʹͨ͠഑ྻΛ࡞Δ my @over20 = grep { $_ > 20 } @numbers; # 20ΑΓେ͖ͳ਺͚ͩΛूΊͨ഑ྻΛ࡞Δ • $_ は特殊変数 • この場合では配列の各要素が順に取り出されて⼊ってくる #hatenaintern)*)+

Slide 27

Slide 27 text

%: ハッシュ • いわゆるディクショナリやマップ my %hash = ( perl => 'larry', ruby => 'matz', ); • => は"fat comma"と呼ばれ、( perl => 'larry' ) は ( 'perl', 'larry' ) と同⼀ #hatenaintern)*)+

Slide 28

Slide 28 text

%: ハッシュ • 右辺は配列のときと同様なリストだが、どんな変数に格納する かでアクセスの仕⽅が変わる • コンテキスト #hatenaintern)*)+

Slide 29

Slide 29 text

Perlのデータ構造 • Perlのデータ構造を意味上で分類するとスカラとリストの2種類 • スカラ(単⼀)の値 • ⽂字列(hoge) • 数値 • リファレンス(後述) • リスト • (1,2,3,'hoge', 'foo') • リストをどう使うかはシジル(@, %)で決定する #hatenaintern)*)+

Slide 30

Slide 30 text

リストのつかいかた • リストをどう使うかはシジル(@, %)で決定する • @array = (1,2,3) • こうすると配列 • %array = (1,2,3) • こうするとハッシュ • 1 => 2, 3 => undef #hatenaintern)*)+

Slide 31

Slide 31 text

リファレンス • とても重要 • リファレンス = スカラ/配列/ハッシュなどへの参照 • Perlの配列やハッシュはかなり素朴 • 複雑なデータ構造を作る場合に必ず必要になる #hatenaintern)*)+

Slide 32

Slide 32 text

リファレンス • ⼊れ⼦の⾏列を作ってみるか... my @matrix = ( (0, 1, 2, 3), (4, 5, 6, 7), ); • このコードは配列の合成になる • リストを⼊れ⼦にできない my @matrix = (0, 1, 2, 3, 4, 5, 6, 7); #hatenaintern)*)+

Slide 33

Slide 33 text

そこでリファレンス 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)*)+

Slide 34

Slide 34 text

配列リファレンスへのアクセス my @array2 = @$ref; # ಄ʹ @ Λ͚ͭͯ഑ྻʹ໭͢ʢσϦϑΝϨϯεʣ print $ref->[1]; # -> Λ࢖ͬͯ௚઀ΞΫηε #hatenaintern)*)+

Slide 35

Slide 35 text

ハッシュリファレンス my %hash = ( perl => 'larry', ruby => 'matz', ); my $ref = \%hash; # ུه my $ref = { perl => 'larry', ruby => 'matz', }; #hatenaintern)*)+

Slide 36

Slide 36 text

ハッシュリファレンスへのアクセス my $ref = { perl => 'larry', ruby => 'matz', }; # % Λ಄ʹ͚ͭͯσϦϑΝϨϯε # keys͸૊ΈࠐΈؔ਺ɻϋογϡͷΩʔͷҰཡΛऔಘ͢Δ my @keys = keys %$ref; print $ref->{perl}; # -> Ͱ௚઀ΞΫηε #hatenaintern)*)+

Slide 37

Slide 37 text

デリファレンスいろいろ • なにかの式をデリファレンスするときは @{ ... } とか %{ ... } で 囲む my $a_of_a = [ [1, 2, 3], [4, 5, 6], ]; my @array = @{ $a->[1] }; #hatenaintern)*)+

Slide 38

Slide 38 text

• Postfix dereference my @array = $a->[1]->@*; #hatenaintern)*)+

Slide 39

Slide 39 text

正規表現 • Perlの強みのひとつ。めちゃ強⼒ • /.../ で正規表現リテラルを⽣成、=~ で⽂字列にマッチさせる my ($id) = ("͜Μʹͪ͸ɺid:motemen Ͱ͢" =~ /id:(.+)/); # จࣈྻϚονͰҰ෦Λൈ͖ग़͢ my @lines = split /\n/, $text; # ೖྗΛߦʹ෼ׂ • perldoc perlre #hatenaintern)*)+

Slide 40

Slide 40 text

そのほか • if ⽂とかは想像通りのものがだいたいある • else if はなくて elsif • ループの制御構⽂ • continueは next, breakは last • ⽂字列の⽐較は == などではなく eq • 数値の場合は==なので気をつけよう • perldoc perlop #hatenaintern)*)+

Slide 41

Slide 41 text

そのほか • ⽂字列の結合は .(ドット)等 $hoge = 'abc' . 'def' # abcdef • qw(foo bar baz) は ('foo', 'bar', 'baz') の糖⾐構⽂ • perldoc -f qw #hatenaintern)*)+

Slide 42

Slide 42 text

そのほか • リストの全体を加⼯するときは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)*)+

Slide 43

Slide 43 text

コンテキスト • Perlの難しいところのひとつ • 式を評価する際に考慮する必要がある • スカラコンテキストとリストコンテキストがある my @array = (10, 20, 30); my @x = @array; # ͜ͷ @array ͸ϦετίϯςΩετͰධՁ͞ΕΔ my $y = @array; # ͜ͷ @array ͸εΧϥίϯςΩετͰධՁ͞ΕΔ my ($z) = @array; # ͜ͷ @array ͸ϦετίϯςΩετͰධՁ͞ΕΔ #hatenaintern)*)+

Slide 44

Slide 44 text

コンテキスト • @x が (10, 20, 30) になるのはまあ⾃然 • では $y は...? • $y == 3 • 配列をスカラコンテキストで評価するとその⻑さを返す • $zには配列の先頭要素が代⼊され($z == 10)配列の残りは 捨てられる #hatenaintern)*)+

Slide 45

Slide 45 text

コンテキストのよくある罠 なんかユーザから送られた⼊⼒を受けとり、リストコンテキスト では配列を返す関数 param() があったとして my $in = { name => param('key') # ͜ͷؔ਺ݺͼग़͠͸ϦετίϯςΩετͰධՁ͞ΕΔ }; #hatenaintern)*)+

Slide 46

Slide 46 text

コンテキストのよくある罠 my $in = { name => ('foo', 'bar', 'baz') }; my $in = { name => 'foo', bar => 'baz', }; という感じになり、なぜかbarという不思議なキーが⽣え、不可解 なバグの原因となりうる #hatenaintern)*)+

Slide 47

Slide 47 text

コンテキストクイズ sort <͜͜>; length <͜͜>; if (<͜͜>) { } for my $i (<͜͜>) { } $obj->method(<͜͜>); my $x = <͜͜>; my ($x) = <͜͜>; my @y = <͜͜>; my %hash = ( key0 => 'hoge', key1 => <͜͜>, ); scalar(<͜͜>); <͜͜>; #hatenaintern)*)+

Slide 48

Slide 48 text

コンテキストクイズ(解答) sort <Ϧετ>; length <Ϧετ>; if (<εΧϥ>) { } for my $i (<Ϧετ>) { } $obj->method(<Ϧετ>); my $x = <εΧϥ> my ($x) = <Ϧετ>; my @y = <Ϧετ>; my %hash = ( key0 => 'hoge', key1 => <εΧϥ>, ); scalar(<Ϧετ>); <εΧϥ>; #hatenaintern)*)+

Slide 49

Slide 49 text

関数(サブルーチン) sub foo { my ($a, $b, $c) = @_; } のように宣⾔して foo(1, 2, 3); で呼び出す。引数なしの関数呼び出しはカッコ省略できる #hatenaintern)*)+

Slide 50

Slide 50 text

引数の受け取り⽅ sub add { my ($x, $y) = @_; return $x + $y; } my $three = add(1, 2); • add(1,2) と呼び出したときの引数は @_ という特殊な配列に格納さ れる • これが($x, $y)に分割代⼊される #hatenaintern)*)+

Slide 51

Slide 51 text

引数の受け取り⽅ • shiftを使う • 引数なしのshiftは暗黙的に@_を引数に取る • my $arg1 = shift;とすると@_の先頭要素が$arg1に代⼊され る • @_は配列なので... • my $arg1 = $_[0]で最初の引数にアクセスすることもできる #hatenaintern)*)+

Slide 52

Slide 52 text

引数処理イディオム sub func1 { my ($arg1, $arg2, %args) = @_; my $opt1 = $args{opt1}; my $opt2 = $args{opt2}; } func1('hoge', 'fuga', opt1 => 1, opt2 => 2); 最後に%argsと受けることで(省略可能な)名前付き引数を実現で きる #hatenaintern)*)+

Slide 53

Slide 53 text

値の返し⽅ • return で返せるが、省略可能 • 省略した場合は最後に評価された式の結果が返り値となる • 意図がわかりづらくなるので書きましょう #hatenaintern)*)+

Slide 54

Slide 54 text

モジュールシステム • パッケージ package Example::Greeter; と書くと、以降のソースコードはExample::Greeterという名前空 間に属する パッケージとは関数の名前が所属する先、と考えると良い #hatenaintern)*)+

Slide 55

Slide 55 text

モジュールシステム • パッケージ package A; sub foo { ... } package B; sub bar { ... } それぞれ A::foo() / B::bar() で関数を参照できる #hatenaintern)*)+

Slide 56

Slide 56 text

モジュールシステム概要 • use Foo::Bar::Baz • lib/Foo/Bar/Baz.pmが読み込まれ、Foo::Bar::Baz名前空間が 作られる • Perlの実⾏ファイルは .pl モジュールは .pm 拡張⼦ • 実務で書くのはほとんど .pm #hatenaintern)*)+

Slide 57

Slide 57 text

モジュールシステム概要 • useしたときのファイルの探索先は@INCというグローバルな特 殊変数に格納されている • 慣習的に、プロジェクト直下の./libを@INCに⼊れるよう構成 されている • @INCを直接操作したり、perl -Ilibで起動する • perldoc -f use / perldoc -v @INC #hatenaintern)*)+

Slide 58

Slide 58 text

典型的なモジュール package Foo::Bar::Baz; use strict; use warnings; # ͜ͷύοέʔδͷ֎͔Β͸ Foo::Bar::Baz::public_function ͰΞΫηεͰ͖Δͧ sub public_function { ... } # ඇެ։ͳؾ෼ͷϝιου͸ _ Ͱ͸͡ΊΔͧɻؾ෼͚ͩͳͷͰ֎͔ΒΞΫηε΋Ͱ͖ͪΌ͏͕ɻ sub _private_function { ... } # Ϟδϡʔϧͷ࠷ޙʹ͸͔ͳΒͣਅ஋Λه͢ɻͦ͏͠ͳ͍ͱ use ͕ࣦഊ͢Δͧɻ 1; #hatenaintern)*)+

Slide 59

Slide 59 text

解説 • use MODULE 'foo', 'bar'...; でモジュールに⽣えている関数をイ ンポートできる • 本当はもう少し汎⽤的で複雑だが、この理解で困らない • useの引数なしでも勝⼿にインポートしてくれるモジュールも ある • Data::Dumper / JSON など #hatenaintern)*)+

Slide 60

Slide 60 text

オブジェクト指向 • Perlはもともとオブジェクト指向⾔語として始まったわけでは ないので後付け • が、普通に使える • パッケージとリファレンスがわかっていれば、ほぼカバーでき る #hatenaintern)*)+

Slide 61

Slide 61 text

ここでオブジェクト指向について考 えよう #hatenaintern)*)+

Slide 62

Slide 62 text

オブジェクト指向とは? • すごく簡単に⾔えばデータ構造と⼿続きを⼀緒にしたもの • オブジェクトはクラスから⽣成される • オブジェクトはデータを持つ • クラスにはデータに対する⼿続き(メソッド)が定義されて いる #hatenaintern)*)+

Slide 63

Slide 63 text

PerlにおけるOOP OOPにおける⽤語 Perlでの⽤語 クラス パッケージ メソッド パッケージに定義された関数 オブジェクト パッケージにbless()されたリフ ァレンス #hatenaintern)*)+

Slide 64

Slide 64 text

bless • blessがオブジェクト指向Perlにおける最後の登場⼈物 # ͳΜ͔σʔλ͕͋Δʢී௨͸ϋογϡϦϑΝϨϯεʣ my $data = { name => 'motemen' }; # σʔλʹύοέʔδΛඥ෇͚Δͱ my $self = bless $data, 'Hatena::Engineer'; # ϝιου͕ݺ΂Δʂ ͜͜Ͱ͸ Hatena::Engineer::tweet $self->tweet(); #hatenaintern)*)+

Slide 65

Slide 65 text

͍͍͔ɺΈΜͳ ɹɹɹɹɹɹɹɹ ƅшƅ ) ɹɹɹɹɹɹɹɹ(|ɹy |) ϋογϡϦϑΝϨϯεͱ package Ͱ͸खଓ͖ܕϓϩάϥϛϯά͔͠Ͱ͖ͳ͍͕ ɹɹɹɹɹ {}ɹ (ƅшƅ)ɹpackage ɹɹɹɹɹɹɹʘʗ|ɹy |ʘʗ ɹɹɹɹೋͭ߹Θ͞Ε͹OOPͱͳΔ ɹɹɹɹɹɹɹɹ(ƅшƅ)ɹ bless ɹɹɹɹɹɹɹɹ(ʘʗʘʗ #hatenaintern)*)+

Slide 66

Slide 66 text

コンストラクタ • コンストラクタも⾃分で書く。普通はnewという名前を使う • が、そういう制約があるわけではない。違う名前のコンスト ラクタを作ることもできる #hatenaintern)*)+

Slide 67

Slide 67 text

コンストラクタ package Person; use strict; use warnings; sub new { my ($class, %args) = @_; return bless \%args, $class; } #hatenaintern)*)+

Slide 68

Slide 68 text

使い⽅ my $person = Person->new(age => 18); # { age => 18 } ͕ Person ʹ bless ͞Εͨ΋ͷ #hatenaintern)*)+

Slide 69

Slide 69 text

使い⽅ • Person->new(age => 01) は Person::new('Person', age => 01) の 糖⾐構⽂ • こうやってクラスメソッドを定義する • blessされていてもハッシュリファレンスであることに変わりはない • $person->{age} で中⾝にアクセスすることも可能 • できるけどオブジェクトを使うところではやらない #hatenaintern)*)+

Slide 70

Slide 70 text

メソッド 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)*)+

Slide 71

Slide 71 text

メソッド $person->incr_age; • $person->incrage_ は $person のbless先である Person をた どって、結局 Person::incr_age($person) と同様 • こうやってインスタンスメソッドが定義できる #hatenaintern)*)+

Slide 72

Slide 72 text

メソッド呼び出しまとめ # ͜ͷೋ͕ͭ౳Ձ Class->method($arg1, $arg2); Class::method('Class', $arg1, $arg2); # ͜ͷೋ͕ͭ౳Ձ $object->method($arg1, $arg2); Class::method($object, $arg1, $arg2); #hatenaintern)*)+

Slide 73

Slide 73 text

継承 package Animal; use strict; use warnings; sub new { ... } sub walk { ... } 1; package Dog; use strict; use warnings; use parent 'Animal'; 1; #hatenaintern)*)+

Slide 74

Slide 74 text

継承 my $dog = Dog->new(); $dog->walk(); # Animal::walk ͕ݺ͹ΕΔ • 仕組みとしては可能だけどあまり最近は使われていない • Perl⾃体がIDEのサポートを受けづらい(無いわけではない) • 複雑になる #hatenaintern)*)+

Slide 75

Slide 75 text

オブジェクト指向まとめ • ⼿作り感あふれるオブジェクト指向 • パッケージに⼿続きを定義 • bless でデータと結びつける • コンストラクタは⾃分でつくる、オブジェクトも⾃分で作る • オブジェクト指向⾵に呼び出せるような糖⾐ #hatenaintern)*)+

Slide 76

Slide 76 text

便利な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)*)+

Slide 77

Slide 77 text

便利なCPANモジュール • ORM • Teng • Aniki • リスト操作系 • List::Util • List::MoreUtils #hatenaintern)*)+

Slide 78

Slide 78 text

便利なCPANモジュール • ͳΜͱ͔::XS • C⾔語のPerl拡張のXS⾔語で書かれてるので⼀般的に早い • それ以外だとなんとか::Liteとかなんとか::Fastみたいなのが早 い(とされる) • モジュールを探すときはmetacpanから探そう • https://metacpan.org/ #hatenaintern)*)+

Slide 79

Slide 79 text

便利なCPANモジュール なんとか::Liteとかの⾼速なモジュールはだいたい⽇本のコミュニ ティから作られている "why does it need to be so fast?" "because we are japanese !!!!" https://uzulla.hateblo.jp/entry/<=>?/=@/>=A=B<@ #hatenaintern)*)+

Slide 80

Slide 80 text

おまけ (現代のPerl) • Perlの最新version /.12からはclass機能が実験的に利⽤可能に • 今開発が熱いぞ!!! #hatenaintern)*)+

Slide 81

Slide 81 text

おまけ (現代の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)*)+

Slide 82

Slide 82 text

テスト テストを書くエコシステムもきちんと整っている • proveというテスト実⾏⽤のコマンドが同梱されている • テストはt/ディレクトリ以下に置く • 拡張⼦は.t(中⾝はPerlスクリプト) #hatenaintern)*)+

Slide 83

Slide 83 text

テスト Testなんとかみたいなモジュールを使ってテストする。 社内(外)でよく使われているテストモジュール • Test&::V) • モダンなテストモジュール • Test::More • 昔からよく使われているテストモジュール • Test::Class • ユニットテストを書きやすくするモジュール #hatenaintern)*)+

Slide 84

Slide 84 text

テスト 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)*)+

Slide 85

Slide 85 text

テスト % 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)*)+

Slide 86

Slide 86 text

Test::Class package t::Person; use strict; use warnings; use parent 'Test::Class'; sub setup : Test(setup) { # ͳʹ͔ෆࢥٞͳຐ๏Ͱؔ਺໊ͷ͋ͱʹΞϊʔςʔγϣϯͰ͖Δ # ֤ςετલͷηοτΞοϓʢม਺ΛΫϦΞͨ͠Γͱ͔ʣ } sub incr_age : Tests { is ...; } #hatenaintern)*)+

Slide 87

Slide 87 text

ということで • 駆け⾜だけどPerlの基礎からオブジェクト指向プログラミングの 話までしました • PerlにおけるWebアプリの話もできると良かったけど(時間的 に)今回はここまで • 来週からいよいよチームに⼊っていくことになります。周りのは てな社員をどんどん頼ってください!! • みんな優しく教えてくれると思います #hatenaintern)*)+